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的结果,直接返回res
            if (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--;
            }
        }
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 广度优先双分裂蛇 广度优先双分裂蛇 双分裂蛇&#xff1a;是求二…

HCIA-Datacom实验_04_实验二:IPv4编址及IPv4路由基础实验

一、拓扑 二、改名 R1 R2 R3 三、配置接口IP R1 R2 R3 四、查看路由表 此时每台设备上会有两条直连路由 R1 R2 R3 五、ping测试 R1pingR2接口 R1pingR3接口 R2pingR1接口 R2pingR3接口 R3pingR1接口 R3pingR2接口 六、配置LoopBack地址 R1 R2 R3 七、写路由 R1到R2的Loo…

吴恩达2022机器学习专项课程(一) 4.1 梯度下降

问题预览 梯度下降算法的作用是&#xff1f;梯度下降的过程&#xff1f;梯度下降和最小化成本函数的联系&#xff1f;所有的成本函数都是一个形状吗&#xff1f;在非凸形状中&#xff0c;梯度下降的更新过程是&#xff1f;在非凸形状中&#xff0c;不同的初值对最小化成本函数…

C++:数据类型—布尔(12)

布尔类型代表就是真和假&#xff08;bool&#xff09; 真就是1&#xff08;true&#xff09; 假就是0&#xff08;false&#xff09; 也可以任务非0即为真 bool 直占用1个字节大小 语法&#xff1a;bool 变量名 (true | false&#xff09; 提示&#xff1a;bool在后期判断也是…

扫描体的概念、应用及实现方法

扫描体&#xff08;Swept Volume&#xff0c;简称SV&#xff09;&#xff0c;从广义上来说&#xff0c;是指以任一对象&#xff08;几何模型或曲面集&#xff09;为扫描母体&#xff0c;沿着空间任一路径&#xff08;扫描路径&#xff09;&#xff0c;以某种方式运动最终产生的…

软考高级架构师:安全模型概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

TC16-161T+ 音频 信号变压器 RF Transformers 600kHz-160MHz 射频集成电路 Mini-Circuits

Mini-Circuits是一家全球领先的射频、微波和毫米波元器件及子系统制造商。TC16-161T是Mini-Circuits出产的一款射频IC&#xff08;射频集成电路&#xff09;&#xff0c;具有平衡-不平衡转换器功用。制造商: Mini-Circuits 产品品种: 音频变压器/信号变压器 RoHS…

一篇文章带你了解Java网络原理

网络发展史 独立模式 独立模式:计算机之间相互独立; ⽹络互连 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&#xff0c;就有了⽹络互连。 ⽹络互连&#xff1a;将多台计算机连接在⼀起…

初步了解JavaSE

目录 前言&#xff1a; 一、Java SE主要包含模块&#xff1a; 二、JavaSE的环境搭建 三、JavaSE简单入门 1&#xff09;文件名称不对&#xff0c;如果有一个叫 helloworld.java&#xff0c;但是class命名为HelloWord. 2&#xff09;如果希望我们文件名称和类名不一致&…

习题2-5 求平方根序列前N项和

本题要求编写程序&#xff0c;计算平方根序列 的前N项之和。可包含头文件math.h&#xff0c;并调用sqrt函数求平方根。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S&#xff0c;精确到小数点后两位。题目保证计算结果不…

docker 共享网络的方式实现容器互联

docker 共享网络的方式实现容器互联 本文以nacos连接mysql为例 前提已经在mysql容器中初始化好nacos数据库&#xff0c;库名nacos 创建一个共享网络 docker network create --driver bridge \ --subnt 192.168.0.0/24 \ --gateway 192.168.0.1 mynet此处可以不指定网络模式、…

【QT+QGIS跨平台编译】045:【netcdf3+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、NetCDF3介绍二、文件下载三、文件分析四、pro文件五、编译实践一、NetCDF3介绍 NetCDF(Network Common Data Form)是一种用于存储科学数据的文件格式和库。NetCDF3 是 NetCDF 的旧版本,通常指的是 NetCDF 版本 3.x。 以下是 NetCDF3 的一些特…

速腾聚创上市后首份财报:冲击年销百万台,押注人形机器人

作者 |老缅 编辑 |德新 港股「激光雷达第一股」速腾聚创&#xff0c;交出了上市后的首份业绩报告。 3月27日&#xff0c;速腾聚创发布了2023年度财报。 报告期内&#xff0c;公司迎来高速的业务增长——2023年总收入达到人民币11.2亿元&#xff0c;同比增长达到111.2%。这主…

算法学习——LeetCode力扣动态规划篇9

算法学习——LeetCode力扣动态规划篇9 1035. 不相交的线 1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 描述 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#x…

CCPC2020 - 秦皇岛 - G. Good Number (数学)

亚历克斯喜欢数字。 亚历克斯认为&#xff0c;正整数 x x x 是好数&#xff0c;当且仅当 ⌊ x k ⌋ \lfloor \sqrt[k]{x} \rfloor ⌊kx ​⌋ 整除 x x x 。 你能告诉他不超过 n n n 的正整数的个数吗&#xff1f; 输入 输入的第一行给出了测试用例的数量 T ( 1 ≤ T ≤…

Pytorch 下载失败原因

错误信息&#xff1a; ERROR: Could not find a version that satisfies the requirement torch (from versions: none) ERROR: No matching distribution found for torch 解决方案&#xff1a; 在官网看到&#xff0c;它需要python3.8-3.11的环境。过高和过低的版本都不…

python学习16:python中的布尔类型和条件语句的学习

python中的布尔类型和条件语句的学习 1.布尔&#xff08;bool&#xff09;类型的定义&#xff1a; 布尔类型的字面量&#xff1a;True表示真&#xff08;是、肯定&#xff09; False表示假&#xff08;否、否定&#xff09; True本质上是一个数字记作1&#xff0c;False记作0 …

208基于matlab的多目标遗传算法的无人机航路规划

基于matlab的多目标遗传算法的无人机航路规划。在三维航路中进行航路代价估计&#xff0c;综合考虑路径长度、隐蔽性、危险度&#xff0c;规划出最优路径。输出3D规划路径。程序已调通&#xff0c;可直接运行。 208 多目标遗传算法 无人机航路规划 - 小红书 (xiaohongshu.com)

力扣---网络延迟时间---迪杰斯特拉,弗洛伊德floyd

首先推荐博客&#xff1a;图论最短路径专题&#xff08;力扣743、5888&#xff09;_力扣 最短路径-CSDN博客 迪杰斯特拉算法&#xff1a; 太久没有做图论的题了&#xff0c;&#xff0c;临时抱佛脚。。 这道题可以转化为max{点x到点k的距离}。因为带权图&#xff08;权值为正…

手机投屏到windows11电脑

1 安装无线投影组件 2 电脑端打开允许其他设备投影的开关 3 手机找到投屏选项 4 手机搜索可用设备连接即可 这里的官方文档给的不太好,给了一些让人眼花撩乱的信息,以下是经过整合的有效信息