LeetCode 双指针专题

11.盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:
在这里插入图片描述
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

本题通过双指针来解决,左指针从左端点开始和右指针从右端点开始,如果左指针的高度比右指针的高度低,则将左指针向右一步,否则右指针向左一步,知道两指针相遇。

int maxArea(vector<int>& height) {int l = 0, r = height.size()-1;int res = 0;while(l < r) {res = max(res, (r - l) * min(height[l], height[r]));if (height[l] < height[r]) {l++;} else {r--;}}return res;
}

15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

这里可能属于三指针的范畴,但是我们依然可以用双指针的做法来解决

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(), nums.end());for(int i=0; i<nums.size()-1; i++) {// 如果排序后第i个数大于0,那么不可能后面有加起来为0的结果,直接返回resif (nums[i] > 0) {return res;}// 判断是否重复if (i > 0 && nums[i] == nums[i-1]) {continue;}int l = i + 1;int r = nums.size()-1;while(l < r) {if(nums[l] + nums[r] + nums[i] > 0) {// 消除重复while(l < r && nums[r] == nums[r-1]){r--;}r--;} else if (nums[l] + nums[r] + nums[i] < 0) {// 消除重复while(l < r && nums[l] == nums[l+1]) {l++;}l++;} else {res.push_back({nums[i], nums[l], nums[r]});// 消除重复while(l < r && nums[l] == nums[l+1]) {l++;}// 消除重复while(l < r && nums[r] == nums[r-1]) {r--;}l++;r--;}}}return res;}
};

31. 下一个排列

整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。

例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
给你一个整数数组 nums ,找出 nums 的下一个排列。

必须 原地 修改,只允许使用额外常数空间。

示例 1:

输入:nums = [1,2,3]
输出:[1,3,2]

示例 2:

输入:nums = [3,2,1]
输出:[1,2,3]

// 1. 从后向前 查找第一个 相邻升序 的元素对 (i,j),满足 A[i] < A[j]。此时 [j,end) 必然是降序
// 2. 在 [j,end) 从后向前 查找第一个满足 A[i] < A[k] 的 k。A[i]、A[k] 分别就是上文所说的「小数」、「大数」
// 3. 将 A[i] 与 A[k] 交换
// 4. 可以断定这时 [j,end) 必然是降序,逆置 [j,end),使其升序
// 5. 如果在步骤 1 找不到符合的相邻元素对,说明当前 [begin,end) 为一个降序顺序,则直接跳到步骤 4
class Solution {
public:void nextPermutation(vector<int>& nums) {int j = -1;int i;for(i=nums.size()-1; i-1>=0; i--){if (nums[i] > nums[i-1]) {j = i;i = j-1;break;}}if (j == -1) {reverse(nums.begin(), nums.end());return;}int k;for(k=nums.size()-1; k>=j; k--) {if(nums[k] > nums[i]) {swap(nums[k], nums[i]);break;}}reverse(nums.begin()+j, nums.end());}
};

75. 颜色分类

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2:

输入:nums = [2,0,1]
输出:[0,1,2]

这是一个荷兰旗问题,我们可以用双指针的办法解决。

class Solution {
public:// L及L的左边都是0,R及R的右边都是2,// 单指针刷过去,如果遇到0,就跟L调换,并将L向右移// 如果遇到2,就跟R调换,R向左移,但是i也需要在停留在当前进行判断void sortColors(vector<int>& nums) {int L = 0, R = nums.size()-1;for(int i=0; i<=R; i++) {if (nums[i] == 0) {swap(nums[i], nums[L]);L++;}else if (nums[i] == 2) {swap(nums[i], nums[R]);R--;i--;}}}
};

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

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

相关文章

权限提升-Linux系统权限提升篇VulnhubPATH变量NFS服务Cron任务配合SUID

知识点 1、Web或普通用户到Linux-服务安全配合SUID-NFS 2、普通用户到Linux-环境变量配合SUID-$PATH 3、Web或普通用户到Linux-计划任务权限不当-Cron 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 …

字体反爬案例分析与爬取实战

字体反爬案例分析与爬取实战 该案例将真实的数据隐藏到字体文件里&#xff0c;即使获取了页面源代码&#xff0c;也没法直接提取数据的真实值。 案例介绍 案例网站https://antispider4.scrape.center/&#xff0c;爬取电影标题、类别、评分等&#xff0c;代码实现如下&#…

腾讯云docker创建容器镜像及仓库

这里为了尽量简单&#xff0c;直接用腾讯云容器版本服务器 腾讯云有自己的镜像加速地址&#xff0c;速度还可以&#xff0c;单纯拉取容器还是够用的 但是当我push容器出现各种各样问题因为网络原因&#xff0c;国内访问docker官方镜像站非常麻烦&#xff0c;所以使用阿里的镜像…

Mac上设置环境变量PATH

1、 打开终端Terminal。 2、 输入以下命令打开你的shell配置文件&#xff0c;比如bash或zsh。如果你使用的是bash&#xff0c;那么你需要编辑~/.bash_profile或者~/.bashrc文件&#xff1b;如果你使用的是zsh&#xff0c;那么你需要编辑~/.zshrc文件。 open -e ~/.bash_prof…

【C++练级之路】【Lv.17】【STL】set类和map类的模拟实现

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、红黑树&#xff08;改造版&#xff09;1.1 结点1.2 迭代器1.2.1 operator1.2.2 operator- - 1.3 本体1.…

安卓开发Gson插件的使用

Gson 是一个流行的 Java 库&#xff0c;用于序列化和反序列化 Java 对象。在 Android 开发中&#xff0c;使用 Gson 插件可以方便地将 Java 对象转换为 JSON 格式&#xff0c;并将 JSON 数据转换回 Java 对象。 以下是使用 Gson 插件的一般步骤&#xff1a; 1. 添加 Gson 库&…

Vite为什么比Webpack快得多?

Vite为什么比Webpack快得多&#xff1f; 在前端开发中&#xff0c;构建工具扮演着至关重要的角色&#xff0c;而Vite和Webpack无疑是两个备受关注的工具。然而&#xff0c;众多开发者纷纷赞誉Vite的速度之快&#xff0c;本文将深入探讨Vite相较于Webpack为何更快的原因&#xf…

c++基础学习第七天(stl)

c基础学习第七天&#xff08;stl&#xff09; 文章目录 1、STL初识1.1 、STL的诞生1.2、STL基本概念1.3、STL六大组件2.4 、STL中容器、算法、迭代器1.5、容器算法迭代器初识1.5.1、vector存放内置数据类型2.5.2、 Vector存放自定义数据类型2.5.3、 Vector容器嵌套容器 2、 STL…

企业知识库搭建不再是难题,靠这几个软件就可以了

在当今知识为王的时代&#xff0c;具备一套强大且实用的企业知识库&#xff08;Knowledge Base&#xff09;已成为提升工作效率、促进团队合作不可或缺的工具。那么&#xff0c;问题来了&#xff0c;我们该如何搭建一套属于自己的知识库呢&#xff1f;今天&#xff0c;我就给大…

WMware虚拟机配置静态IP

注意&#xff1a;如果是克隆的虚拟机&#xff0c;需要先重新生成mac地址&#xff0c;如下图所示 修改配置文件 &#xff1a;/etc/sysconfig/network-scripts/ifcfg-ens33 注意&#xff1a;1. BOOTPROTO设置为static 2.将下面的IPADDR地址替换为你实际要设置的ip地址 3.NAT模式…

ArrayList 与 List的区别 数组与集合的区别

ArrayList是一种非泛型集合类型&#xff0c;允许用户存储任何数据类型的对象&#xff0c; List 是一种泛型集合类型&#xff0c;允许用户存储声明时 List 指定的数据类型的对象。它是一个非常强类型的集合&#xff0c; var arrayList new ArrayList(); arrayList.Add(1); // …

前端学习<二>CSS基础——13-CSS3属性:Flex布局图文详解

前言 CSS3中的 flex 属性&#xff0c;在布局方面做了非常大的改进&#xff0c;使得我们对多个元素之间的布局排列变得十分灵活&#xff0c;适应性非常强。其强大的伸缩性和自适应性&#xff0c;在网页开中可以发挥极大的作用。 flex 初体验 我们先来看看下面这个最简单的布局…

软考数据库

目录 分值分布1. 事务管理1.1 事物的基本概念1.2 数据库的并发控制1.2.1 事务调度概念1.2.2 并发操作带来的问题1.2.3 并发控制技术1.2.4 隔离级别&#xff1a; 1.3 数据库的备份和恢复1.3.1 故障种类1.3.2 备份方法1.3.3 日志文件1.3.4 恢复 SQL语言发权限收权限视图触发器创建…

【华为OD机试C++】004:字符串分隔

《最新华为OD机试题目带答案解析》&#xff1a;最新华为OD机试题目带答案解析&#xff0c;语言包括C、C、Python、Java、JavaScript等。订阅专栏&#xff0c;获取专栏内所有文章阅读权限&#xff0c;持续同步更新&#xff01; 文章目录 描述输入描述输出描述示例代码 描述 •输…

Ubuntu搭建环境Cmake-Libtorch-Torchvision-PCL-VTK-OpenCV

Ubuntu搭建环境Cmake-Libtorch-Torchvision-PCL-VTK-OpenCV 安装Cmake安装libtorch安装torchvision安装PCL安装PCL的依赖项PCL多版本共存问题编译PCL库程序验证创建CMakeLists.txt 安装VTK安装OpenCV编译OpenCV库编译版本环境配置&#xff1a;程序验证创建opencv_test文件夹 和…

BaseDao封装增删改查(超详解)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍对数据库中表中的数据进行增改删查询&#xff0c;封装一个工具类&#xff08;BaseDao&#xff09;的详细使用以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &…

动态规划——回文串问题

目录 练习1&#xff1a;回文子串 练习2&#xff1a;最长回文子串 练习3&#xff1a;回文串分割IV 练习4&#xff1a;分割回文串 练习5&#xff1a;最长回文子序列 练习6&#xff1a;让字符串成为回文串的最小插入次数 本篇文章主要学习使用动态规划来解决回文串相关问题&…

ES6 学习(一)-- 基础知识

文章目录 1. 初识 ES62. let 声明变量3. const 声明常量4. 解构赋值 1. 初识 ES6 ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff0c;是使得」JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为…

python 报错问题汇总

error: [WinError 32] 另一个程序正在使用此文件&#xff0c;进程无法访问。: d:\\anaconda\\envs\\yolov5\\lib\\site-packages\\ISR-2.2.0-py3.7.egg 解决方法&#xff1a;重启pycharm python-contrib 无法安装 opencv-contrib-python 安装包网址&#xff1a;安装包下载链接…

c++ vector介绍

1、什么是vector std::vector 是C标准库&#xff08;STL&#xff09;中的一个动态数组类模板。它允许存储相同类型的元素集合&#xff0c;并且可以根据需要动态地增加或减少其大小。std::vector 提供了一组函数来访问、插入和删除元素&#xff0c;以及执行其他与数组操作相关的…