LeetCode Hot100 回顾(二)

子串

560.和为K的子数组

使用前缀和预处理一下题目给的数组, 然后用二重循环遍历一遍就可以了。

239.滑动窗口最大值

看题面比较容易想到的是用优先级队列来解决, 但是STL中的priority_queue不支持随机删除, 如果要用优先级队列来解决这道题的话比较复杂。这道题的一种正确解法是用单调队列来处理, 单调队列专门用来处理类似滑动窗口的区间最值问题。

接下来来看针对这道题, 单调队列是如何处理元素的入队和出队呢?

  • 入队: 从队列的后方入队, 弹出所有比当前元素(即待入队元素)小的元素, 因为这些元素都比当前元素小, 而且入队时间更早, 如果队列中有当前元素, 那么这些较小的元素永远不可能成为答案
  • 出队: 从队列的前方出队, 先弹出所有已经在区间外的元素, 然后得到的队头即是当前窗口的最大值
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res;deque<int> que;  // 出队从前面, 入队从后面for (int i = 0; i < k; ++i) {while(!que.empty() && nums[i] > nums[que.back()]) que.pop_back();que.push_back(i);}res.push_back(nums[que.front()]);for (int i = k; i < nums.size(); ++i) {  // 枚举区间右端点while(!que.empty() && nums[i] > nums[que.back()]) que.pop_back();que.push_back(i);while(que.front() <= i-k) {que.pop_front();}res.push_back(nums[que.front()]);}return res;}
};

这类区间最值问题还可以使用ST表或线段树来解决, 不过针对滑动窗口的区间最值问题, 还是单调队列更简便一些。

普通数组

53.最大子数组和

从前往后遍历, 用一个变量来记录和, 如果这个变量记录到的和小于0, 就将它重置为0; 因为它不会给答案带来正面的收益, 算上它之后数组的和只会更小。注意要处理全是负数的数组的情况, 此时答案就为数组中最大的负数。

56. 合并区间

刚开始打算使用使用一个大小为1e4的数组来标记区间, 但是发现这种方法不能处理[1, 4], [5, 7]的例子, 这个例子实际没有产生重叠, 但依旧会在数组中产生一个连续的不为0的区间。正确处理方式是对所有区间按照左端点进行排序, 然后就可以方便的进行合并操作了。

189.轮转数组

使用区间拷贝的库函数, 几行就搞定了。空间复杂度为O(1)的方法可以通过旋转数组来实现。

class Solution {
public:void rotate(vector<int>& nums, int k) {k %= nums.size();vector<int> tmp(nums.rbegin(), nums.rbegin()+k);copy(nums.begin(), nums.end()-k, nums.begin()+k);copy(tmp.rbegin(), tmp.rend(), nums.begin());}
};

238.除自身以外数组的乘积

预处理前缀乘积和后缀乘积即可, 其中一个预处理数组可以使用一个变量来简化, 另一个预处理数组可以使用返回结果数组来代替。

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {vector<int> res(nums.size());res[0] = 1;for (int i = 0; i < nums.size()-1; ++i) {res[i+1] = res[i] * nums[i];}int t = 1;for (int i = nums.size()-1; i >= 0; --i) {res[i] *= t;t *= nums[i];}return res;}
};

矩阵

73.矩阵置零

直接说进阶方法,用第1行和第1列来记录第i行/第j列是否需要置零,第1行和第1列是否需要置0可以使用两个标志变量来记录。

54.螺旋矩阵

我采用了一种类似分治的想法,通过一个循环来不断输出数组,在循环的过程中,每输出一整行,剩下需要输出的矩阵的高就减1;同样每输出一整列,剩下需要输出的矩阵的宽就减1,直到剩余矩阵的宽或高变为0时,输出就结束了。通过一个变量来标记当前输出的方向。

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> res;int height = matrix.size();int width = matrix[0].size();pair<int, int> pos(0, 0);/***  移动方向* 1 --- 横向增大* 2 --- 纵向增大** -1 --- 横向减小* -2 --- 纵向减小*/int dir = 1;while(height && width) {if (dir == 1) {for (int i = 0; i < width; ++i) {res.push_back(matrix[pos.first][pos.second+i]);}--height;pos.second += width-1;pos.first += 1;dir = 2;} else if (dir == 2) {for (int i = 0; i < height; ++i) {res.push_back(matrix[pos.first+i][pos.second]);}--width;pos.first += height-1;pos.second -= 1;dir = -1;} else if (dir == -1) {for (int i = 0; i < width; ++i) {res.push_back(matrix[pos.first][pos.second-i]);}--height;pos.second -= width-1;pos.first -= 1;dir = -2;} else if (dir == -2) {for (int i = 0; i < height; ++i) {res.push_back(matrix[pos.first-i][pos.second]);}--width;pos.first -= height-1;pos.second += 1;dir = 1;}}return res;}
};

48.旋转图像

矩阵旋转90度,只需要沿对角线翻转矩阵,然后把矩阵逐行逆序即可。

240.搜索二维矩阵

遍历所有列, 二分查找。看了三叶的评论, 发现这个矩阵可以抽象成根节点在矩阵右上角的二叉搜索树, 太妙了。

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {  // 抽象成二叉搜索树pair<int, int> pos{0, matrix[0].size()-1};while(true) {if (target > matrix[pos.first][pos.second]) {  // 往右子树查找if (pos.first == matrix.size()) return false;++pos.first;} else if (target < matrix[pos.first][pos.second]) {if (pos.second == 0) return false;--pos.second;} else {return true;}}return false;}
};

链表

160.相交链表

可以知道, 如果两个链表相交, 那么从链表的末尾到相交节点的距离一定是相等的, 我们在遍历两个链表的过程中, 可以先将指针移动到距离链表结尾距离相等的位置, 然后同时移动两个指针, 移动过程中查看两个指针是否指向了同一个节点。

206. 翻转链表

头插法即可。这里学习一下如何使用递归来完成翻转, 这里的递归和以前用到的递归形式不太一样, 不太好理解

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {if (!head || !head->next) return head;ListNode* p = head;ListNode* newHead = reverseList(head->next);  // (1)假设head后的所有节点都完成了翻转head->next->next = head;  // (2)翻转后head的下一个节点变成了head前面紧邻的节点head->next = nullptr;  // (3)head->next置空return newHead;  // 返回翻转后的新头节点}
};

我们现在取一个中间状态来讲解一下,假设现在递归调用到了处理节点2的情况,执行完(1)后链表的情况是这样的

执行完(2)之后链表情况是这样的

执行完(3)之后是这样的

234.回文链表

判断回文串的方式就是找到中间节点, 使用两个指针分别向两边移动, 依次比较即可, 难点主要在链表不能简单的找到它的前驱节点, 我们可以利用递归函数的性质来比较

class Solution {
private:ListNode* p;int pos;
public:bool isPalindrome(ListNode* head) {ListNode* slow = head, *fast = head;pos = 0;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;++pos;}if (fast) p = slow->next;else p = slow;return cmp(head, 0);}bool cmp(ListNode* head, int cnt) {if (cnt < pos) {if (cmp(head->next, cnt+1)) {if (head->val == p->val) {p = p->next;return true;} else {return false;}} else {return false;}}return true;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/657618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全通道堵塞识别摄像机

当建筑物的安全通道发生堵塞时&#xff0c;可能会给人员疏散和救援带来重大隐患。为了及时识别和解决安全通道堵塞问题&#xff0c;专门设计了安全通道堵塞识别摄像机&#xff0c;它具有监测、识别和报警功能&#xff0c;可在第一时间发现通道堵塞情况。这种摄像机通常安装在通…

Vue Router

Vue Router 一、Vue Router 回顾 1、路由简介 路由是一个比较广义和抽象的概念&#xff0c;路由的本质就是对应关系。 在开发中&#xff0c;路由分为&#xff1a; ​ 后端路由​ 前端路由 后端路由 概念&#xff1a;根据不同的用户 URL 请求&#xff0c;返回不同的内容本…

Mysql+MybatisPlus+Vue实现基础增删改查CRUD

数据库 设计数据库 设计几个字段&#xff0c;主键id自动增长且不可为空 create table if not exists user (id bigint(20) primary key auto_increment comment 主键id,username varchar(255) not null comment 用户名,sex char(1) not null comment 性…

【乳腺肿瘤诊断分类及预测】基于Elman神经网络

课题名称&#xff1a;基于Elman神经网络的乳腺肿瘤诊断分类及预测 版本日期&#xff1a;2023-05-15 运行方式: 直接运行Elman0501.m 文件即可 代码获取方式&#xff1a;私信博主或QQ&#xff1a;491052175 模型描述&#xff1a; 威斯康辛大学医学院经过多年的收集和整理&a…

《Numpy 简易速速上手小册》第6章:Numpy 高级数组操作(2024 最新版)

文章目录 6.1 使用布尔索引和条件选取6.1.1 基础知识6.1.2 完整案例&#xff1a;筛选股市数据6.1.3 拓展案例 1&#xff1a;筛选健康数据6.1.4 拓展案例 2&#xff1a;筛选和替换 6.2 缺失数据和无效数据处理6.2.1 基础知识6.2.2 完整案例&#xff1a;气象数据处理6.2.3 拓展案…

突破瓶颈,提升开发效率:Spring框架进阶与最佳实践-IOC

IOC相关内容 1.1 bean基础配置1.1.1 bean基础配置(id与class)1.1.2 bean的name属性步骤1&#xff1a;配置别名步骤2:根据名称容器中获取bean对象步骤3:运行程序 1.1.3 bean作用范围scope配置1.1.3.1 验证IOC容器中对象是否为单例验证思路具体实现 1.1.3.2 配置bean为非单例1.1.…

k8s中调整Pod数量限制的方法

一、介绍 Kubernetes节点每个默认允许最多创建110个pod&#xff0c;有时可能由于主机配置扩容的问题&#xff0c;从而需要修改节点pod运行数量的限制。 即&#xff1a;需要调整Node节点的最大可运行Pod数量。 一般来说&#xff0c;只需要在kubelet启动命令中增加–max-pods参数…

以“美”为鉴,探寻香港比特币现货ETF的未来发展

出品&#xff5c;欧科云链研究院 作者&#xff5c;Hedy Bi 根据The Block于1月29日的报道&#xff0c;嘉实国际成为了首家向香港证监会提交比特币现货ETF申请的机构。早在去年12月22日&#xff0c;香港证监会发布了《有关证监会认可基金投资虚拟资产的通函》&#xff0c;明确…

华为云codeArts使用操作流程

一、开启服务 什么是华为云CodeArts&#xff1f; 本实验将在华为云CodeArts平台上搭建一个凤凰商城开发项目&#xff0c;并完成需求管理、代码仓库、代码检查、编译构建、发布、部署、流水线等软件开发操作。 1)新建项目 进入华为云“控制台”&#xff0c;鼠标移动到页面左侧菜…

使用“快速开始”将数据传输到新的 iPhone 或 iPad

使用“快速开始”将数据传输到新的 iPhone 或 iPad 使用 iPhone 或 iPad 自动设置你的新 iOS 设备。 使用“快速开始”的过程会同时占用两台设备&#xff0c;因此请务必选择在几分钟内都不需要使用当前设备的时候进行设置。 确保你当前的设备已连接到无线局域网&#xff0c;并…

【三维重建】运动恢复结构(SfM)

运动恢复结构是通过三维场景的多张图像&#xff0c;恢复出该场景的三维结构信息以及每张图片对应的摄像机参数。 欧式结构恢复(内参已知&#xff0c;外参未知) 欧式结构恢复问题&#xff1a; 已知&#xff1a;1、n个三维点在m张图像中的对应点的像素坐标 2、相机内参 求解&…

Qt之QLabel介绍

概述 QLabel是QT界面中的标签类&#xff0c;它从QFrame下继承&#xff0c;QLabel 类代表标签&#xff0c;它是一个用于显示文本或图像的窗口部件。我们主要介绍一下QLabel的一些简单的使用。 设置颜色背景色和字体的颜色大小 字体及颜色 设置文字使用的是setText函数。 QStri…

CSA发布 | 法律视角下的数据出境《2023年数据出境合规年鉴》

在全球数字产业以及大数据和云计算技术快速发展的背景下&#xff0c;数据流动对世界经济的影响日益显著。由此带来的数据红利和数据安全之间的冲突&#xff0c;将对未来数字经济的发展方向产生深刻影响。 2023 年可称为中国数据跨境监管的元年&#xff0c;这一年初出境评估的“…

算法:积木游戏学习数学

一、算法描述 小华和小微一起通过玩积木游戏学习数学。 他们有很多积木&#xff0c;每个积木块上都有一个数字&#xff0c;积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排&#xff0c;请小微找到这排积木中数字相同且所处位置最远的2块积木块&#xff0c;计算他们的…

第六讲:函数扩展(static,extern)

今天讲讲两个关键字&#xff0c;在此之前&#xff0c;我们先介绍两个概念。 1.作用域&#xff1a;某变量可以使用的范围。 1.1局部变量的作用域&#xff1a;变量所在的局部范围。 1.2全局变量的作用域&#xff1a;整个工程 2.生命周期&#xff1a;变量从申请内存到被回收内…

高中数学:逻辑用语及量词

一、逻辑用语 充分条件与必要条件 充分必要条件的判断&#xff0c;本质就是判断两个集合之间是子集还是真子集的关系 要点&#xff1a;看清楚谁是条件P&#xff0c;谁是结论Q 二、逻辑量词 存在量词与全称量词 命题的真假 三、常见题型 1、已知充分必要性&#xff0c;求…

Vue+OpenLayers7入门到实战:OpenLayers7使用一张静态图片作为地图的基本底图,使用png图片作为地图底图示例

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章介绍如何使用OpenLayers7在地图上使用一张静态图片作为地图的基本底图。 本章主要用处在于如果我们项目没有vmts、vms、xyz等地图服务,只有一张静态图片,也可以作为地图基本图层使用。 二、依赖和使用 "o…

美国DDOS服务器:应对攻击的策略与技术

分布式拒绝服务(DDOS)攻击是一种常见的网络攻击手段&#xff0c;旨在通过大量无用的请求拥塞目标服务器&#xff0c;使其无法正常处理合法请求。美国作为全球互联网技术的领先者&#xff0c;其DDOS服务器在应对这类攻击时具有一系列先进的技术和策略。本文将详细介绍美国DDOS服…

Arrays.asList()方法调用add()或remove()抛出java.lang.UnsupportedOperationException问题

在使用Arrays.asList方法将以,分割的字符串转为list集合时&#xff0c;调用add和remove等方法时会抛出java.lang.UnsupportedOperationException。以下为原因和解决方法。 原因&#xff1a; Arrays.asList()方法返回了一个Arrays类的一个继承了AbstractList的ArrayList内部类…

ElementUI 组件:Layout布局(el-row、el-col)

ElementUI安装与使用指南 Layout布局 点击下载learnelementuispringboot项目源码 效果图 el-row_el-col.vue页面效果图 项目里el-row_el-col.vue代码 <script> export default {name:el-row_el-col 布局 }</script><template><div class"roo…