当前位置: 首页 > news >正文

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])(ji)

每个状态下,两个指针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 jk)找到另外两个数,使得 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[i1],我们就跳过,直接 i i i++, 直到 n u m s [ i ] ≠ n u m s [ i − 1 ] nums[i] \ne nums[i-1] nums[i]=nums[i1] 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 jk 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. 接雨水 题单链接&#xff1a; LeetCode 热题 100 1. 两数之和 leetcode题目链接 题解1&#xff1a;暴力枚举 时间复杂度&#xff1a; O ( n 2 ) O(n^2) O(n2) class …...

Python爬虫常见代理池实现和优化

在这篇文章中&#xff0c;我们将探讨Python爬虫中常见的代理池实现和优化方法。在爬取网站数据时&#xff0c;为防止被目标网站封禁IP&#xff0c;我们通常会使用代理IP进行访问。一个高效且稳定的代理池可以帮助我们轻松应对各种反爬策略。   首先&#xff0c;我们来了解一下…...

前端面试的话术集锦第 3 篇:进阶篇上

这是记录前端面试的话术集锦第三篇博文——进阶篇上,我会不断更新前端面试话术的博文。❗❗❗ 1 谈谈变量提升 当执⾏JS代码时,会⽣成执⾏环境,只要代码不是写在函数中的,就是在全局执⾏环境中,函数中的代码会产⽣函数执⾏环境,只此两种执⾏环境。 b() // call b conso…...

【文字到语音的论文总结】

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

E. Data Structures Fan(思维 + 异或前缀和)

Problem - E - Codeforces 给你一个整数数组 a1, a2,..., an&#xff0c;以及一个由 n 个字符组成的二进制字符串† s。 Augustin 是一个数据结构的爱好者。因此&#xff0c;他请你实现一个可以回答 q 个查询的数据结构。这里有两种类型的查询&#xff1a; Plain Text "1…...

初学python爬虫学习笔记——爬取网页中小说标题

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

The WebSocket session [x] has been closed and no method (apart from close())

在向客户端发送消息时&#xff0c;session关闭了。 不管是单客户端发送消息还是多客户端发送消息&#xff0c;在发送消息之前判断session 是否关闭 使用 isOpen() 方法...

前端实现展开收起的效果 (react)

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

ABY2.0:更低的通信开销

参考文献&#xff1a; [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.图片为本地上传的预览&#xff1a; <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.打开浏览器访问&#xff1a;192.168.2.100:8080/&#xff0c;正常可以看到以下界面...

计算机网络的故事——HTTP报文内的HTTP信息

HTTP报文内的HTTP信息 文章目录 HTTP报文内的HTTP信息一、HTTP 报文二、请求报文及响应报文的结构三、编码提升传输速率 一、HTTP 报文 HTTP报文是由多行&#xff08;CRLF作换行符&#xff09;数据构成的字符串文本&#xff0c;HTTP报文可以分为报文首部和报文主体两部分&…...

CF1120 D. Power Tree 巧妙的图论转化

传送门 [前题提要]:无 题目描述: 就是给你一棵树,然后每个点有花费,然后你可以选一个点,付费后对这个点的子树的所有叶子结点增减任意权值. 考虑有一个人会给这棵树的所有叶子结点赋值(值我们不知道),输出最小的花费,使得无论它如何赋值,我们使用上述的花 费都能使所有的叶子…...

【算法训练-字符串 三】最长公共子串、最长公共子序列

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【】&#xff0c;使用【】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&#xff1a;目标公…...

lintcode 1446 · 01矩阵走路问题 【两次BFS, VIP 中等 1也计算距离,但是不入队列】

题目链接&#xff0c;描述 https://www.lintcode.com/problem/1446 给定一个大小为 n*m 的 01 矩阵 grid &#xff0c;1 是墙&#xff0c;0 是路&#xff0c;你现在可以把 grid 中的一个 1 变成 0&#xff0c;请问从左上角走到右下角是否有路可走&#xff1f;如果有路可走&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年&#xff0c;瑞典家电巨头伊莱克斯推出全球首款扫地机器人“三叶虫”。 与现在的产品相比&#xff0c;“三叶虫”靠随机碰撞的模式对空间进行清扫&#xff0c;清洁效率很低&#xff0c;市场渗透率也不高&#xff0c;但并不妨碍戴森、iRo…...

PHP NBA球迷俱乐部系统Dreamweaver开发mysql数据库web结构php编程计算机网页

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

JavaScript-----DOM元素

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

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...