【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;}
};

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

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

相关文章

驱动器的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理2.1,信号转换2.2,电流放大2.3,电压级转换2.4,控制输出3,结构特点3.1,高集成度3.2,多功能性3.3,高性能3.4,省电节能3.5,稳定可靠4,工艺流程<

面试经典150题【101-110】

文章目录 面试经典150题【101-110】9.回文数61.加一172.阶乘后的069.x的平方根50.Pow(x,n)149.直线上最多的点数52.N皇后II120.三角形最小路径和64.最小路径和63.不同路径II 面试经典150题【101-110】 6道偏数学的题和4道二维dp 9.回文数 一开始想转为字符串再判断。后来发现…

信号处理--基于混合CNN和transfomer自注意力的多通道脑电信号的情绪分类的简单应用

目录 关于 工具 数据集 数据集简述 方法实现 数据读取 ​编辑数据预处理 传统机器学习模型(逻辑回归&#xff0c;支持向量机&#xff0c;随机森林) 多层感知机模型 CNNtransfomer模型 代码获取 关于 本实验利用结合了卷积神经网络 (CNN) 和 Transformer 组件的混合…

五-容量管理之容量预案

容量预案(Capacity Plan)是容量管理的一个重要组成部分。 容量预警条件和措施&#xff1a; 类型预警条件措施应用服务器Load95分位值大于CPU核数的2倍 前一天CPU 95分位值大于90% 内存使用率95分位值大于90%增加应用服务器数据库数据库连接超过200扩容DB服务规格/ 优化SQL查询…

windows下powershell与linux下bash美化教程(使用starship)

starship美化教程 Win11 Powershell 安装 在命令行使用下面命令安装 # 安装starship winget install starship将以下内容添加到 Microsoft.PowerShell_profile.ps1&#xff0c;可以在 PowerShell 通过 $PROFILE 变量来查询文件的位置 Invoke-Expression (&starship i…

【HBZ分享】Kafka为什么性能非常高

Kafka性能高的原因 磁盘顺序读写&#xff1a;磁盘顺序读写的性能可以和内存相媲美&#xff0c;顺序读写不需要寻道时间&#xff0c;也不需要大幅旋转磁头找扇区&#xff0c;所以性能极高 零拷贝&#xff1a; 大幅降低了用户态与内核态之间的切换&#xff0c;从而减少了数据来回…

Chrome安装Vue插件vue-devtools

安装Vue.js开发者工具&#xff08;Vue DevTools&#xff09;到Google Chrome浏览器的步骤可能会随着Vue DevTools更新和Chrome政策变化而有所调整。 1.从GitHub获取源代码&#xff1a; 访问Vue DevTools的GitHub仓库&#xff1a;https://github.com/vuejs/vue-devtools 根据仓…

web学习笔记(四十五)Node.js

目录 1. Node.js 1.1 什么是Node.js 1.2 为什么要学node.js 1.3 node.js的使用场景 1.4 Node.js 环境的安装 1.5 如何查看自己安装的node.js的版本 1.6 常用终端命令 2. fs 文件系统模块 2.1引入fs核心模块 2.2 读取指定文件的内容 2.3 向文件写入指定内容 2.4 创…

sql oracle 获取当前日期的最后一天

语法 LAST_DAY 传入一个日期类型的变量&#xff0c;但会给你一个当月的最后一天的变量 LAST_DAY(TO_DATE(year || - || SUBSTR(month, -2) || -01, YYYY-MM-DD)) < ?应用实例 AssetValueSingleQT.spl 一个表中只存储的年和月&#xff0c;需要更具年月筛选小于指定日期&…

yarn按包的时候报错 ../../../package.json: No license field

运行 yarn config list 然后运行 yarn config set strict-ssl false 之后yarn就成功了

基于SpringBoot“网上选课系统”设计和实现(源码定制以及咨询!!)

博主介绍&#xff1a;✌全网粉丝10W,B站项目阿龙、csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、华为云获奖者&#xff0c;“程序员阿龙”✌ 主要内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python&#xff0c;MYSQL、Hodpoo…

网络工程师软考中级考试大纲

考试要求&#xff1a; &#xff08;1&#xff09;熟悉计算机系统的基础知识&#xff1b;&#xff08;2&#xff09;熟悉网络操作系统的基础知识&#xff1b;&#xff08;3&#xff09;理解计算机应用系统的设计和开发方法&#xff1b;&#xff08;4&#xff09;熟悉数据通信的基…

SpringBoot2.6.3 + knife4j-openapi3

1.引入项目依赖&#xff1a; <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</artifactId><version>4.5.0</version> </dependency> 2.新增配置文件 import io.swag…

Docker搭建LNMP环境实战(05):CentOS环境安装Docker-CE

前面几篇文章讲了那么多似乎和Docker无关的实战操作&#xff0c;本篇总算开始说到Docker了。 1、关于Docker 1.1、什么是Docker Docker概念就是大概了解一下就可以&#xff0c;还是引用一下百度百科吧&#xff1a; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以…

【机器学习之---数学】随机游走

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 随机游走 1. 概念 1.1 例1 在你的饮食俱乐部度过了一个富有成效的晚上后&#xff0c;你在不太清醒的状态下离开了。因此&#xff0c;你会醉醺醺地在展…

【OpenStack】在本地OpenStack中创建一个应用及其网络

【OpenStack】在本地OpenStack中创建一个应用及其网络 目录 【OpenStack】在本地OpenStack中创建一个应用及其网络应用程序设计创建项目创建一个新项目使用新项目创建网络创建我们的应用程序VNET创建路由器更新安全组创建浮动IP结论推荐超级课程: Docker快速入门到精通Kuberne…

计算机视觉中的NMS非极大值抑制

NMS 是“非极大抑制”&#xff08;Non-Maximum Suppression&#xff09;的缩写&#xff0c;是一种在目标检测算法中广泛使用的技术。它的主要目的是减少目标检测过程中的多余的边界框&#xff0c;以便只保留最佳的一个边界框。 在目标检测任务中&#xff0c;算法会对图像中可能…

数据结构(五)单链表专题

在开始之前&#xff0c;我先来给大家讲一下顺序表与链表的区别&#xff1a; 它们在堆上存储的差异&#xff1a; 我们可以很容易的知道&#xff0c;循序表是连续的有序的&#xff0c;但链表是杂乱的&#xff0c;它们通过地址彼此联系起来。 1. 链表的概念及结构 概念&#xff1…

智慧交通(代码实现案例)

1.项目简介 目标: 了解智慧交通项目的架构知道智慧交通项目中的模块能够完成智慧交通项目的环境搭建 该项目是智慧交通项目&#xff0c;通过该项目掌握计算机视觉的方法在交通领域的相关应用&#xff0c;包括车道线检测的方法&#xff0c;多目标车辆追踪及流量统计方法&#…

t检验原理

t检验是一种常用的统计方法&#xff0c;用于比较两个样本均值是否有显著差异。它的基本原理是通过计算样本均值之间的差异&#xff0c;以及这种差异相对于样本误差的大小来判断差异是否显著。 t检验的基本步骤如下&#xff1a; 1. 假设两个样本是独立、随机抽取的&#xff0c;…