【C++ leetcode】双指针(专题完结)

15. 三数之和

题目

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

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

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

题目链接

. - 力扣(LeetCode)

画图 和 文字 分析

这道题和 两数之和等于一个值 大体思路是一样的,都是 排序 + 双指针思想

排完序后,我们定义三个指针,一个指向最后一个元素的位置,一个指向首元素的位置,另一个首元素的后一个位置

举例:

输入: [-1,0,1,2,-1,-4]

输出:[[-1,-1,2],[-1,0,1]]

先固定 k不动

  1. 如果三者指向的值相加为 0 ,则记录数据 ,再 j++ , k--
  2. 如果三者指向的值 < 0 ,则 j++
  3. 如果三者指向的值 > 0 ,则 k--

当 i >= j (结束里层循环)

再 i++ , j = i + 1 , k = n - 1

直到 i + 1 >= k (外层循环)

做到以上,只能说完成了完成了不漏掉每一种情况,但现在还有去重的关键一步

去重需要我们在前面的基础上做更改:

第一种情况:

走完上面的步骤 :

判断现在 j 所指的内容 和 j - 1 所指内容是否相同,直到不相同为止(这里需要一个循环,此时要么,j 指向一个不和之前相重复的数,要么越界)

判断 k 同理

上面是里层循环的去重,外层循环也可以去重

当结束里层循环,完成后面的步骤 :

判断 i 所指向的内容 和 i - 1所指向的内容是否相同,直到不相同为止

注意:

去重的时候,因为循环的缘故,一定要防止越界

 

代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        vector<vector<int>> t;
        sort(nums.begin(),nums.end());
        int i = 0;
        while(i + 2 <= nums.size() - 1)
        {
            int j = i + 1;
            int k = nums.size() - 1;;
            while(j < k)
            {
                if(nums[i] + nums[j] + nums[k] > 0)
                {
                    k--;
                }
                else if(nums[i] + nums[j] + nums[k] < 0)
                {
                    j++;
                }
                else
                {
                    vector<int> x;
                    x.push_back(nums[i]);
                    x.push_back(nums[j]);
                    x.push_back(nums[k]);
                    t.push_back(x);
                    int n = nums[j];
                    int m = nums[k];
                    k--;
                    j++;
                    while(j < k && n == nums[j])
                    {
                        j++;
                    }
                    while(j < k && m == nums[k])
                    {
                        k--;
                    }
                }
            }
            int h = nums[i];
            i++;
            while(i + 2 <= nums.size() - 1 && h == nums[i])
            {
                i++;
            }
        }
        
        return t;
    }
};

18 . 四数之和

题目

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • a、b、c 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

题目链接

. - 力扣(LeetCode)

画图 和 文字 分析

在 leetcode 15. 三数之和 基础之上做出的改变

思想:排序 + 双指针思想

定义四个指针,三个指针分别指向前三个元素的位置,第四个指针指向最后一个元素的位置

举例:

输入:nums = [1,0,-1,0,-2,2], target = 0

输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

后面的三个指针和之前的做法一模一样,第一个指针在里层所有循环结束后++

再判断现在 a 所指向的元素和 a - 1 所指向的元素是否相同

直到 a + 2 >= d (外层循环结束)

注意:

  1. 注意越界情况
  2. 判断四数之和是否得到一个值,这里容易由于数据过大发生整型溢出现象,可以改成 longlong 类型 或者针对处理这一可能

代码

class Solution {
public:
    bool iscompare(int &a,int &b,int &c,int &d,int &target)
    {
         if(target < 0 && (a >= 0 && b >= 0 && c >= 0 && d >= 0))
         {
            return false;
         }
         else if(target > 0 && (a <= 0 && b <= 0 && c <= 0 && d <= 0))
         {
            return false;
         }
         else if(target == 0 && ((a > 0 && b > 0 && c > 0 && d > 0) || (a > 0 && b > 0 && c > 0 && d > 0)))
         {
            return false;
         }
         else
         {
            return true;
         }
    }
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        vector<vector<int>> s;
        int n = nums.size() - 1;
        sort(nums.begin(),nums.end());
        int a = 0;
        while(a + 2 < n)
        {
            int b = a + 1;
            while(b + 1 < n)
            {
                
                int  c = b + 1;
                int  d = n;
                while(c < d)
                {
                    if(!iscompare(nums[a],nums[b],nums[c],nums[d],target))
                    {
                        break;
                    }
                    if(nums[a] + nums[b]  > target - nums[c] - nums[d] )
                    {
                        d--;
                    }
                    else if(nums[a] + nums[b]  < target - nums[c] - nums[d] )
                    {
                        c++;
                    }
                    else
                    {
                        vector<int> t;
                        t.push_back(nums[a]);
                        t.push_back(nums[b]);
                        t.push_back(nums[c]);
                        t.push_back(nums[d]);
                        s.push_back(t);
                        int s1 = nums[c];
                        int s2 = nums[d];
                        d--;
                        c++;
                        while(c < d && nums[c] == s1)
                        {
                            c++;
                        }
                        while(c < d && nums[d] == s1)
                        {
                            d--;
                        }

                    }
                }
                int s3 = nums[b];
                b++;
                while(b + 1 < n && nums[b] == s3)
                {
                   b++;
                }
            }
            int s4 = nums[a];
            a++;
            while(a + 2 < n && nums[a] == s4)
            {
                a++;
            }
        }
        return s;
    }
};

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

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

相关文章

P1443马的遍历 典bfs

题目&#xff1a; 代码&#xff1a; #include<algorithm> #include<iostream> #include<cstring> #include<queue>using namespace std;int n,m;int dx[] {-1,-1,-2,-2,1,1,2,2}; int dy[] {-2,2,-1,1,-2,2,-1,1}; bool vis[450][450];struct node{…

秋招打卡算法题第一天

一年多没有刷过算法题了&#xff0c;已经不打算找计算机类工作了&#xff0c;但是思来想去&#xff0c;还是继续找吧。 1. 字符串最后一个单词的长度 public static void main(String[] args) {Scanner in new Scanner(System.in);while(in.hasNextInt()){String itemin.nextL…

Ubuntu 下统计文件数量的命令

参考:https://blog.csdn.net/kxh123456/article/details/123811580 查看当前目录下的文件数量&#xff08;不包含子目录中的文件&#xff09; ls -l|grep "^-"| wc -l实例展示&#xff1a;如下图所示&#xff0c;当前路径下&#xff0c;有2个json文件和2个文件夹&a…

面向对象【Annotation注解】

文章目录 注解概述注解与注释常见的 Annotation最基本的注解使用@Override@Override@SuppressWarnings元注解@Retention@Target@Documented@Inherited自定义注解格式定义使用注解概述 注解(Annotation)是从 JDK5.0 开始引入,以“@注解名”在代码中存在。例如: @Override @D…

EtherCAT转RS232网关在风电领域的应用

开疆智能EtherCAT转RS232网关在风电领域的应用主要体现在以下几个方面&#xff1a; 1.数据采集与传输&#xff1a;在风力发电设备中&#xff0c;传感器和执行器的数据采集和传输至关重要。EtherCAT转RS232网关可以将风力发电设备中的RS232通信协议转换为EtherCAT协议&#xff0…

Unity 布局元素Layout Element

Layout Element是一种用于控制UI元素在布局组件&#xff08;如Horizontal Layout Group、Vertical Layout Group、Grid Layout Group、Content Size Fitter和Aspect Ratio Fitter&#xff09;中的大小和位置的组件。Layout Element组件可以附加到UI元素上&#xff0c;以便在布局…

操作系统—信号量和条件变量实践

文章目录 信号量和条件变量实践1.实验基本环境(1).基本系统环境 2.信号量(1).如何使用信号量?(2).课上的例子(3).打印合法括号序列(4).打印很多条鱼 3.条件变量(1).为什么选择条件变量?(2).还是课上的例子(3).还是合法括号序列 (4).还是打印很多鱼总结 参考资料 信号量和条件…

设计模式之装饰模式解析

装饰模式 1&#xff09;概述 1.定义 动态地给一个对象增加一些额外的职责&#xff0c;在增加对象功能时&#xff0c;装饰模式比生成子类实现更为灵活。 2.作用 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为。 3.结构图 4.角色 Component&#xf…

编程语言|C语言——C语言标识符的命名规则

1.标识符简介 在计算机高级语言中&#xff0c;用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。标识符可以简单认为是一个名字&#xff0c;用来标识变量名、常量名、函数名及数组等。变量名a、b、c,符号常量名PI、Pai,函数名printf、scanf等都是标…

题目:忐忑楼梯Ⅱ

问题描述&#xff1a; 解题思路&#xff1a; 利用差分&#xff0c;当第一个以后的差分元素都为零时就代表楼梯高度等于第一个楼梯的高度。为什么是第一个呢&#xff0c;因为以第一个为标准的区间操作数最少。 注意点&#xff1a;每次都只能加一或减一&#xff0c;ans开ll 题解&…

港澳青年看祖国—千名青年创业家内地暨江港青年交流活动在江举行

为聚焦“一点两地”全新定位&#xff0c;助力纵深推进新阶段粤港澳大湾区建设&#xff0c;3月22日&#xff0c;江门市委统战部、团市委、市青联联合香港深水埗区青年发展及公民教育委员会、愿景基金会、香港青年创业家总商会举办千名青年创业家内地行暨江港青年交流活动&#x…

2024/3/27打卡接龙数列——动态规划(线性DP/最长上升子序列)

目录 题目 思路 代码 题目 思路 这个题求最少删除多个个数&#xff0c;其实是求最长的接龙数列&#xff0c;用总个数-接龙数列的个数就是最少删除的个数。 那么如何求解最长的接龙数列的问题。 思考&#xff0c;每个数都有选或不选的两种选项&#xff08;选&#xff1a;可以…

【Java程序设计】【C00384】基于(JavaWeb)Springboot的民航网上订票系统(有论文)

【C00384】基于&#xff08;JavaWeb&#xff09;Springboot的民航网上订票系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#x…

Pillow教程04:学习ImageDraw+Font字体+alpha composite方法,给图片添加文字水印

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

在FMEA风险控制中,首检的重要性!——SunFMEA软件

在制造业中&#xff0c;FMEA被广泛应用于产品设计、生产过程和产品服务的各个阶段。而首检&#xff0c;作为生产过程中的一个重要环节&#xff0c;同样承载着风险控制和质量保障的重任。 今天SunFMEA软件系统从FMEA风险控制的角度来看&#xff0c;首检具有至关重要的地位。首检…

VS Code配置C/C++环境

1.插件安装完之后最好重启一下软件&#xff0c;这样就可以对插件的配置进行修改 2.配置C/C环境按这篇博客来&#xff0c;基本就能成功。 【C/C】vscode配置C/C环境-CSDN博客 3. 参见&#xff1a; win10下vscode配置c语言环境-阿里云开发者社区 (aliyun.com)

蓝牙耳机什么牌子好?拒绝跟风购买!五大良心品牌推荐

​真无线蓝牙耳机已经成为我们日常生活中不可或缺的数码产品。随着技术的发展&#xff0c;人们对蓝牙耳机的要求越来越高&#xff0c;不仅要求音质出众&#xff0c;还希望长时间佩戴也能保持舒适&#xff0c;并能适应多种使用场景。挑选蓝牙耳机确实需要一些技巧。所以&#xf…

linux 网卡配置 vlan/bond/bridge/macvlan/ipvlan 模式

linux 网卡模式 linux网卡支持非vlan模式、vlan模式、bond模式、bridge模式&#xff0c;macvlan模式、ipvlan模式等&#xff0c;下面介绍交换机端及服务器端配置示例。 前置要求&#xff1a; 准备一台物理交换机&#xff0c;以 H3C S5130 三层交换机为例准备一台物理服务器&…

中科数安——企业文件资料防泄密|数据防泄密|透明加密系统|源代码防泄露

#文件防泄密软件# 中科数安作为领先的信息安全解决方案提供商&#xff0c;专注于为企业及机构提供全面的文件资料防泄密和数据防泄漏解决方案&#xff0c;具体产品和服务涵盖以下几个方面&#xff1a; 中科数安 || 文件资料、数据防泄密系统 PC地址&#xff1a;www.weaem.com …

2024高安全个人密码本程序源码 可生成随机密码/备忘录/二代密码(带安装教程)

Youngxj Pwd 您的贴身密码管家 在这个网络发达的年代&#xff0c;人人都需要上网&#xff0c;一旦上网就不难避免需要用到账号密码&#xff0c;在账号众多的情况下&#xff0c;你是否还在为你复杂难记的密码担忧着&#xff0c;现在只需要记录一次&#xff0c;就可以随时查看你的…