LeetCode热题100 【cpp】题解(一)哈希表和双指针
文章目录
- 1. 两数之和
- 49. 字母异位词分组
- 128. 最长连续序列
- 283. 移动零
- 11. 盛最多水的容器
- 15. 三数之和
- 42. 接雨水
题单链接: LeetCode 热题 100
1. 两数之和
leetcode题目链接
题解1:暴力枚举
时间复杂度: O ( n 2 ) O(n^2) O(n2)
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v;for (int i = 0; i < nums.size() - 1; i ++) {for (int j = i + 1; j < nums.size(); j ++) {if (nums[i] + nums[j] == target) {v.push_back(i), v.push_back(j);}}}return v;}
};
题解2:哈希表
时间复杂度: O ( n ) O(n) O(n)
使用hash表来存target - x的差值的下标。这里使用cpp里面的unordered_map
,它的查找效率为 O ( 1 ) O(1) O(1)
补充unordered_map
查找key的方法:count(), 如果存在某个key, 返回1;如果不存在某个key,返回0.
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> heap; // heap存 <差值, 下标>for (int i = 0; i < nums.size(); i ++) {int r = target - nums[i];if (heap.count(r)) { // count方法判断key存不存在return {heap[r], i};}heap[nums[i]] = i; // 记录这个数的下标}return {};}
};
49. 字母异位词分组
leetcode题目链接
题解:
字母异位词的意思是某些字符串含有相同的字母,并且每个字母出现的次数相同。字母异位词也可以理解为字符串排完序之后完全相同。
本题解利用后者(排序)进行处理:如果两个字符串是字母异位词,那么它们排完序之后一定相同。可以使用哈希表来维护一个string的vector,记录排完序相同的字符串。时间瓶颈是在排序上,排序的复杂度是 n l o g n nlogn nlogn。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> hash;for(auto& str: strs) {string nstr = str; // nstr为排序过后的新字符串sort(nstr.begin(), nstr.end());hash[nstr].push_back(str);}vector<vector<string>> res;for(auto& item: hash) {res.push_back(item.second);}return res;}
};
128. 最长连续序列
leetcode题目链接
题解:哈希表
我们每次从一个序列的最小值开始枚举,如果是连续的,迭代器不停++。比如最小值是x,那么其后是x+1, x+2, …, y,那么该连续序列的长度是多少呢?是y - x +1 这么长。为了加快查找速度,我们将所有元素存入哈希表unordered_set
S中。还有一个问题,如何确定一个序列的开始呢? 如果哈希表S中存在x,不存在x - 1,那么我们就说x是一个序列的开始。
补充
unordered_set
这个hash表,会将元素去重,并且不会排序,可以通过元素的值快速检索出该元素。
时间复杂度: O ( n ) O(n) O(n)
class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> S;// 构造hash表:将所有元素插入到set中for(auto x: nums) S.insert(x);int res = 0;for(auto x : S) {// 枚举序列的最小值xif(S.count(x) && !S.count(x - 1)) {int y = x;// 如果是连续的序列,y一直++while(S.count(y + 1)) {y ++;}res = max(res, y - x + 1); // 更新序列长度}}return res;}
};
283. 移动零
leetcode题目链接
题解:双指针
前一个指针x从头开始遍历数组,后一个指针k保存非零元素,k从零开始,逐渐加1。当所有的非零元素都移动到前面之后,此时k指向第一个零的位置,从此往后枚举补零即可。
时间复杂度: O ( n ) O(n) O(n)
class Solution {
public:void moveZeroes(vector<int>& nums) {int k = 0; // k是后一个指针,用于存放非零的数for (auto x : nums) {if (x) {nums[k] = x;k ++;}}// 把数组后面的位置补零while (k < nums.size()) {nums[k] = 0;k ++;}}
};
11. 盛最多水的容器
leetcode题目链接
题解:双指针
两个指针i 和 j形成的水槽的面积由短板决定,面积计算公式如下:
S = m i n ( h [ i ] , h [ j ] ) ∗ ( j − i ) S = min(h[i], h[j]) * (j - i) S=min(h[i],h[j])∗(j−i)
每个状态下,两个指针i和j向中间移动一格,都会使得底边变短,怎样才能使得面积变大呢?
只有每次把短板向中间靠拢,它向中间靠拢才可能使矩形的高变高,面积才能变大。因为下一个状态的高度可能比短板高。移动的过程中,每次记录下来面积的最大值。参考 leetcode题解
时间复杂度: O ( n ) O(n) O(n)
class Solution {
public:int maxArea(vector<int>& height) {int res = 0;for (int i = 0, j = height.size() - 1; i < j;) {res = max(res, min(height[i], height[j]) * (j - i));// 每次短边向中间移动if (height[i] < height[j]) i ++;else j --;}return res;}
};
15. 三数之和
leetcode题目链接
题解:排序 + 双指针
对数组从小到大排序。开始遍历数组,第一个下标 i i i 表示三个数中的第一个,我们固定这个数,然后使用双指针算法(枚举 j 和 k j和k j和k)找到另外两个数,使得 n u m s [ i ] + n u m s [ j ] + n u m s [ k ] ≥ 0 , i < j < k nums[i] + nums[j] + nums[k] \ge 0, i < j < k nums[i]+nums[j]+nums[k]≥0,i<j<k,同时使得k尽可能的小(k是最后一个指针,指向三数中的最大值,从右往左移动)。在上述情况中找到三数之和等于0的情况。
另外,需要确保没有枚举出来重复的情况,比如 n u m s = [ − 1 , − 1 , − 1 , − 1 , 2 ] nums = [-1, -1, -1, -1, 2] nums=[−1,−1,−1,−1,2],怎样才能做到只出现一次 [ − 1 , − 1 , 2 ] [-1, -1, 2] [−1,−1,2]?在枚举的时候如果出现 n u m s [ i ] = = n u m s [ i − 1 ] nums[i] == nums[i-1] nums[i]==nums[i−1],我们就跳过,直接 i i i++, 直到 n u m s [ i ] ≠ n u m s [ i − 1 ] nums[i] \ne nums[i-1] nums[i]=nums[i−1]。 n u m s [ j ] nums[j] nums[j]同理。
时间复杂度: O ( n 2 ) O(n^2) O(n2),排序是 O ( n l o g n ) , O(nlogn), O(nlogn), 外层循环 ( i ) (i) (i)是 O ( n ) O(n) O(n), 内层双指针循环 j 和 k j 和 k j和k 是 O ( n ) O(n) O(n),相乘是 O ( n 2 ) O(n^2) O(n2)。
参考题解:acwing题解
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;if (nums.size() < 3) return res;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); i ++) {if (i > 0 && nums[i] == nums[i - 1]) continue;// 双指针:j是头指针,k是尾指针,两者向中间靠拢for (int j = i + 1, k = nums.size() - 1; j < k; j ++) {if (j > i + 1 && nums[j] == nums[j - 1]) continue;// 找到3数之和 ≥ 0 的最小的位置, k是3数之和≥0的最前面的位置while (j < k - 1 && nums[i] + nums[j] + nums[k - 1] >= 0) k --;if (nums[i] + nums[j] + nums[k] == 0)res.push_back({nums[i], nums[j], nums[k]});}}return res;}
};
42. 接雨水
leetcode题目链接
题解:双指针,计算总面积 - 陆地面积。计算总面积时是每行的面积进行累加。
数组求和使用cpp中的accumulate函数。
参考题解:接雨水
class Solution {
public:int trap(vector<int>& height) {int length = height.size();if (length < 3) return 0;int l = 0, r = length - 1;// 前一次计算时的高度int preHeight = 0;// 陆地 + 雨水的总面积int totalArea = 0;// 陆地面积:数组所有数求和int landArea = 0;// accumulate 是cpp累加函数landArea = accumulate(height.begin(), height.end(), 0);while (l < r) {while (l < r && height[l] <= preHeight) l ++;while(l < r && height[r] <= preHeight) r --;// 每一层的面积:高度差 x 宽度totalArea += (min(height[l], height[r]) - preHeight) * (r - l + 1);preHeight = min(height[l], height[r]);}return totalArea - landArea;}
};
相关文章:
LeetCode热题100 【cpp】题解(一)哈希表和双指针
文章目录 1. 两数之和49. 字母异位词分组128. 最长连续序列283. 移动零11. 盛最多水的容器15. 三数之和42. 接雨水 题单链接: LeetCode 热题 100 1. 两数之和 leetcode题目链接 题解1:暴力枚举 时间复杂度: O ( n 2 ) O(n^2) O(n2) class …...
Python爬虫常见代理池实现和优化
在这篇文章中,我们将探讨Python爬虫中常见的代理池实现和优化方法。在爬取网站数据时,为防止被目标网站封禁IP,我们通常会使用代理IP进行访问。一个高效且稳定的代理池可以帮助我们轻松应对各种反爬策略。 首先,我们来了解一下…...
前端面试的话术集锦第 3 篇:进阶篇上
这是记录前端面试的话术集锦第三篇博文——进阶篇上,我会不断更新前端面试话术的博文。❗❗❗ 1 谈谈变量提升 当执⾏JS代码时,会⽣成执⾏环境,只要代码不是写在函数中的,就是在全局执⾏环境中,函数中的代码会产⽣函数执⾏环境,只此两种执⾏环境。 b() // call b conso…...

【文字到语音的论文总结】
1.文字到语音的整个过程 文字到语音的一般整体结构 主要是下面这个流程,每个网络可能会把其中两者或是三者融合在一起来; 长度不同的问题 生成的语音可能和文字的长度并不一样,因此需要解决这个问题 Tactron使用的是交叉注意力的方式解…...

E. Data Structures Fan(思维 + 异或前缀和)
Problem - E - Codeforces 给你一个整数数组 a1, a2,..., an,以及一个由 n 个字符组成的二进制字符串† s。 Augustin 是一个数据结构的爱好者。因此,他请你实现一个可以回答 q 个查询的数据结构。这里有两种类型的查询: Plain Text "1…...

初学python爬虫学习笔记——爬取网页中小说标题
初学python爬虫学习笔记——爬取网页中小说标题 一、要爬取的网站小说如下图 二、打开网页的“检查”,查看html页面 发现每个标题是列表下的一个个超链接,从183.html到869.html 可以使用for循环依次得到: x range(183,600) for i in x:pr…...

The WebSocket session [x] has been closed and no method (apart from close())
在向客户端发送消息时,session关闭了。 不管是单客户端发送消息还是多客户端发送消息,在发送消息之前判断session 是否关闭 使用 isOpen() 方法...

前端实现展开收起的效果 (react)
需求背景:需要实现文本的展开收起效果,文本是一行一行的,数据格式是数组结构。 如图所示(图片已脱敏) 简单实现:使用一个变量控制展开收起效果。 展开收起逻辑部分(react) const […...

ABY2.0:更低的通信开销
参考文献: [ABY] Demmler D, Schneider T, Zohner M. ABY-A framework for efficient mixed-protocol secure two-party computation[C]//NDSS. 2015.[ABY3] Mohassel P, Rindal P. ABY3: A mixed protocol framework for machine learning[C]//Proceedings of the…...
vue项目预览图片
1.图片为本地上传的预览: <input type"file" ref"file"/> <img :src"imgUrl"/>let fr new FileReader()fr.readAsArrayBuffer(this.$refs.file.files[0])fr.addEventListener("loadend", (e) > {let buff…...

Tomcat 安装
1.关闭防火墙 2.安装JDK包 3. 4。添加环境变量 5.刷新配置文件 6.解压文件 7.启动tomcat 8. 9.编写tomcat.service文件 vim /etc/systemd/system/tomcat.service 10.刷新服务 11.打开浏览器访问:192.168.2.100:8080/,正常可以看到以下界面...

计算机网络的故事——HTTP报文内的HTTP信息
HTTP报文内的HTTP信息 文章目录 HTTP报文内的HTTP信息一、HTTP 报文二、请求报文及响应报文的结构三、编码提升传输速率 一、HTTP 报文 HTTP报文是由多行(CRLF作换行符)数据构成的字符串文本,HTTP报文可以分为报文首部和报文主体两部分&…...
CF1120 D. Power Tree 巧妙的图论转化
传送门 [前题提要]:无 题目描述: 就是给你一棵树,然后每个点有花费,然后你可以选一个点,付费后对这个点的子树的所有叶子结点增减任意权值. 考虑有一个人会给这棵树的所有叶子结点赋值(值我们不知道),输出最小的花费,使得无论它如何赋值,我们使用上述的花 费都能使所有的叶子…...

【算法训练-字符串 三】最长公共子串、最长公共子序列
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【】,使用【】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公…...
lintcode 1446 · 01矩阵走路问题 【两次BFS, VIP 中等 1也计算距离,但是不入队列】
题目链接,描述 https://www.lintcode.com/problem/1446 给定一个大小为 n*m 的 01 矩阵 grid ,1 是墙,0 是路,你现在可以把 grid 中的一个 1 变成 0,请问从左上角走到右下角是否有路可走?如果有路可走&am…...

第一个实例:QT实现汽车电子仪表盘
目录 1.实现效果 1.1.视频演示 1.2.实现效果截图 2.生成的安装程序 3.功能概述 4.具体实现 5.QT扩展介绍 5.1.QT介绍 5.2.QT历史发展 5.3.QT平台支持 5.4.Qt Creator 5.5.优势 5.5.1.优良的跨平台特性 5.5.2.面向对象 5.5.3.丰富的 API 1.实现效果 1.1.视频演…...

【MySQL系列】MySQL的事务管理的学习(一)_ 事务概念 | 事务操作方式 | 事务隔离级别
「前言」文章内容大致是MySQL事务管理。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、事务概念二、事务的版本支持三、事务提交方式四、事务常见的操作方式4.1 事务正常操作4.2 事务异常验证 五、事务隔离级别5.1 查看与设置隔离性5.2 读未提交&…...

扫地机器人还能创新吗?云鲸给了个Yes
作者 | 辰纹 来源 | 洞见新研社 1996年,瑞典家电巨头伊莱克斯推出全球首款扫地机器人“三叶虫”。 与现在的产品相比,“三叶虫”靠随机碰撞的模式对空间进行清扫,清洁效率很低,市场渗透率也不高,但并不妨碍戴森、iRo…...

PHP NBA球迷俱乐部系统Dreamweaver开发mysql数据库web结构php编程计算机网页
一、源码特点 PHP NBA球迷俱乐部系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 基于PHP的NBA球迷俱乐部 二、功能介绍 1、前台主要功能: 系统首页 网站介…...

JavaScript-----DOM元素
目录 前言: 1. DOM介绍 2. 获取节点 3. 操作HTML内容 4. 监听事件 案例 5. 操作节点的标签属性 6. 操作样式 7. 创建、添加、删除节点 前言: 在此之前我们要想去操作网页元素一般是去通过CSS选择器实现的,今天我们就学习JavaScript里…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...