专题1 - 双指针 - leetcode 15. 三数之和 - 中等难度

leetcode 15. 三数之和 - 点击直达

  • leetcode 15. 三数之和 中等难度 双指针
    • 1. 题目详情
      • 1. 原题链接
      • 2. 基础框架
    • 2. 解题思路
      • 1. 题目分析
      • 2. 算法原理
      • 3. 时间复杂度
    • 3. 代码实现
    • 4. 知识与收获

在这里插入图片描述

leetcode 15. 三数之和 中等难度 双指针

1. 题目详情

给你一个整数数组 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 。

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

提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105

1. 原题链接

leetcode 15. 三数之和

2. 基础框架

● Cpp代码框架

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {}
};

2. 解题思路

1. 题目分析

( 1 ) (1) (1) 本题要求找出数组 n u m s nums nums中满足条件:三个位置都不同数 n u m s [ i ] + n u m s [ j ] + n u m s [ k ] = = t a r g e t nums[i]+nums[j]+nums[k]==target nums[i]+nums[j]+nums[k]==target的所有结果。

2. 算法原理

( 1 ) (1) (1) 首先想到暴力解法:先进行三层for循环遍历数组 n u m s nums nums,然后使用C++中set容器对结果进行去重处理,时间复杂度是 O ( n 3 ) O(n^3) O(n3)

( 2 ) (2) (2) 在分析三数之和之前,我们先来看看两数之和为target时,如何在nums中寻找这两个数:
首先还是想到暴力解法:进行两层for循环,时间复杂度 O ( n 2 ) O(n^2) O(n2),如何优化呢?

使用对撞双指针算法:
先看张图吧:
在这里插入图片描述

先对数组 n u m s nums nums进行快速排序, n u m s nums nums中就得到非递减的序列;
有序数组好就好在有序上,我们就可以找规律了:
左指针left指向第一个元素,右指针right指向最后一个元素。此时两个数的和 s u m = n u m s [ l e f t ] + n u m s [ r i g h t ] sum = nums[left] + nums[right] sum=nums[left]+nums[right] 注意这是一个有序数组,left指向的元素是[left, right]范围内最小的元素,right指向的元素是[left, right]中最大的元素。
sum的变化情况是:left向右移动时,sum不变或增大;right向左移动时sum不变或减小;
所以我们可以通过比较sumtarget(本题target是0)的大小来确定移动的情况:
1.sum > target,想要趋近targetsum需要减小,所以移动右指针right
2.sum < target,想要趋近targetsum需要增大,所以移动左指针left
3.sum == target,得到了一个结果nums[left]和nums[right]。但是题目要求得到所有的结果,所以还需要继续,此时为了保证结果不重复,需要依据当前得到的结果进行去重处理(即当前已经有了结果nums[left],之后的出现的所有与nums[left]相同的元素都直接略过不在考虑,因为一定是结果中有的。right同理)
本题去重就是控制left和right跳过所有与自身重复的元素,这里需要注意的是控制left++或right--时需要先判断left或right是否越界,因为在极端情况下所有元素都相同,指针一直移动导致越界(细节细节)
在这里插入图片描述

( 3 ) (3) (3) 好了,现在我们来看三数之和,其实就是上文两数之和的变形。三数之和的题目要求 n u m s [ i ] + n u m s [ l e f t ] + n u m s [ r i g h t ] = = t a r g e t nums[i]+nums[left]+nums[right]==target nums[i]+nums[left]+nums[right]==target本题target为0),变形为 n u m s [ l e f t ] + n u m s [ r i g h t ] = = t a r g e t − n u m s [ k ] nums[left]+nums[right]==target-nums[k] nums[left]+nums[right]==targetnums[k],把target-nums[i]整体当做新的target,记为newtarget,所以得到 n u m s [ l e f t ] + n u m s [ r i g h t ] = = n e w t a r g e t nums[left]+nums[right] == newtarget nums[left]+nums[right]==newtarget
在这里插入图片描述

( 4 ) (4) (4) 具体做法就是在两数之和的基础上在加上一层循环,遍历数组nums,每次确定一个nums[i],即确定一个newtarget。内层双指针leftright在范围[i+1, n-1]内以newtarget为目标进行寻找。
在本次循环结束时需要额外在做的一点是对nums[i]也要进行进行去重处理,同时也需要进行是否越界访问的判断(细节细节),至于为什么要进行去重,原理和两数之和做法类似。

( 5 ) (5) (5)

3. 时间复杂度

O ( n 2 ) O(n^2) O(n2)

外层循环每次确定一个目标值,内层循环在目标值之后的区间内寻找满足两数之和条件的结果。

3. 代码实现

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> vvi;// 排序sort(nums.begin(), nums.end());int n = nums.size();for(int i = 0; i < n;){// 两数之和int l = i + 1, r = n - 1;while(l < r){int sum = nums[l] + nums[r];int target = -nums[i];if(sum > target) r--;else if(sum < target) l++;else{vvi.push_back({nums[i], nums[l], nums[r]});l++;r--;//去重while(l < r && nums[l] == nums[l - 1]) l++;while(l < r && nums[r] == nums[r + 1]) r--;} }// 去重i++;while(i < n && nums[i] == nums[i - 1]) i++;}return vvi;}
};

4. 知识与收获

( 1 ) (1) (1) 三数之和是两数之和的变形,理解了两数之和的核心思想,三数之和也就能够顺理成章的解决。
( 2 ) (2) (2) 理解为什么需要去重处理:
对于两数之和(a+b=target):一个组合(a, b)满足了条件,数组又是有序的,对于a来说,以后的所有与其相同的数如果也满足了条件,那么一定会与(a,b)组合相同;对于b来说与a同理。
对于三数之和(a+b+c=target):变形为(a+b=target-c),target确定,本次循环内c也确定


T h e The The E n d End End

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

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

相关文章

Pytorch实战01——CIAR10数据集

目录 1、model.py文件 &#xff08;预训练的模型&#xff09; 2、train.py文件&#xff08;会产生训练好的.th文件&#xff09; 3、predict.py文件&#xff08;预测文件&#xff09; 4、结果展示&#xff1a; 1、model.py文件 &#xff08;预训练的模型&#xff09; impor…

吴恩达机器学习笔记 十七 通过偏差与方差诊断性能 正则化 偏差 方差

高偏差&#xff08;欠拟合&#xff09;&#xff1a;在训练集上表现得也不好 高方差&#xff08;过拟合&#xff09;&#xff1a;J_cv要远大于J_train 刚刚好&#xff1a;J_cv和J_train都小 J_cv和J_train与拟合多项式阶数的关系 从一阶到四阶&#xff0c;训练集的误差越来越小…

力扣串题:验证回文串2

整体思路&#xff1a;先找到可能存在问题的点&#xff0c;然后判断&#xff0c;如果一切正常则左指针会来到字符串中部 bool isValidPalindrome(char *s, int i, int j) {while (i < j) {if (s[i] ! s[j]) {return false;}i;j--;}return true; }bool validPalindrome(char …

禁用文本框输入中文,禁用中文输入法的ImeMode方法

之前遇到一个问题&#xff0c;在文本框切换输入法为中文后&#xff0c;使用扫码枪扫码时 会出现 比如条码NH123456 在文本框内会显示 你好23456 这里可以使用输入法编辑器ImeMode枚举属性 如果文本框只能输入英文数字&#xff0c;可以使用ImeMode.Disable&#xff0c;但默…

LeetCode(力扣)算法题_1261_在受污染的二叉树中查找元素

今天是2024年3月12日&#xff0c;可能是因为今天是植树节的原因&#xff0c;今天的每日一题是二叉树&#x1f64f;&#x1f3fb; 在受污染的二叉树中查找元素 题目描述 给出一个满足下述规则的二叉树&#xff1a; root.val 0 如果 treeNode.val x 且 treeNode.left ! n…

js【详解】ajax (含XMLHttpRequest、 同源策略、跨域)

ajax 的核心API – XMLHttpRequest get 请求 // 新建 XMLHttpRequest 对象的实例 const xhr new XMLHttpRequest(); // 发起 get 请求&#xff0c;open 的三个参数为&#xff1a;请求类型&#xff0c;请求地址&#xff0c;是否异步请求&#xff08; true 为异步&#xff0c;f…

Linux使用git命令行教程

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 git安装git仓库的创建.git 文件添加文件git 三板斧(add,commit,push)解释拓展git log.gitignore git安装 首先输入git --version看看有没有安装git 如…

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料 ⭐️Python语言在编程业界的地位2024年3月编程语言排行榜&#xff08;TIOBE前十&#xff09; ⭐️Python开发语言开发环境介绍1.**IDLE**2.⭐️PyCharm3.**Anaconda**4.**Jupyter Notebook**5.**Sublime Text** …

操作系统——cpu、内存、缓存介绍

一、内存是什么 内存就是系统资源的代名词&#xff0c;它是其他硬件设备与 CPU 沟通的桥梁&#xff0c; 计算机中的所有程序都在内存中运行。其作用是暂时存放CPU的运算数据&#xff0c;以及与硬盘交换的数据。也是相当于CPU与硬盘沟通的桥梁。只要计算机在运行&#xff0c;CP…

【C++那些事儿】深入理解C++类与对象:从概念到实践(下)| 再谈构造函数(初始化列表)| explicit关键字 | static成员 | 友元

&#x1f4f7; 江池俊&#xff1a;个人主页 &#x1f525; 个人专栏&#xff1a;✅C那些事儿 ✅Linux技术宝典 &#x1f305; 此去关山万里&#xff0c;定不负云起之望 文章目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit 关键字 2. static成员2.1 概念…

EasyPoi 教程

文章目录 EasyPoi教程文档1. 前传1.1 前言 这个服务即将关闭,文档迁移到 http://www.wupaas.com/ 请大家访问最新网站1.2 Easypoi介绍1.3 使用1.4 测试项目1.5 可能存在的小坑 2. Excel 注解版2.1 Excel导入导出2.2 注解注解介绍ExcelTargetExcelEntityExcelCollectionExcelIgn…

【PTA】L1-026 L1-027(c++) L1-028 L1-029 L1-030 L1-031(C)第五天

目录 L1-026 I Love GPLT 题解&#xff1a; L1-027 出租 题解&#xff08;c&#xff09;&#xff1a; L1-028 判断素数 题解&#xff1a; L1-029 是不是太胖了 题解&#xff1a; L1-030 一帮一 题解&#xff1a; L1-031 到底是不是太胖了 题解&#xff1a; L1-026 I…

智慧城市与数字经济:共创城市新价值

随着科技的快速发展&#xff0c;智慧城市与数字经济已成为推动城市现代化进程的重要引擎。它们不仅提升了城市治理的效率和公共服务水平&#xff0c;还为城市经济发展注入了新的活力。本文旨在探讨智慧城市与数字经济如何共同创造城市新价值&#xff0c;并分析其面临的挑战与发…

R语言复现:如何利用logistic逐步回归进行影响因素分析?

Logistic回归在医学科研、特别是观察性研究领域&#xff0c;无论是现况调查、病例对照研究、还是队列研究中都是大家经常用到的统计方法&#xff0c;而在影响因素研究筛选自变量时&#xff0c;大家习惯性用的比较多的还是先单后多&#xff0c;P&#xff1c;0.05纳入多因素研究&…

【考研学子必看 ★2024考研国家线及调剂策略(2)】

----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项&#xff0c;系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TimePicker)

时间选择组件&#xff0c;根据指定参数创建选择器&#xff0c;支持选择小时及分钟。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TimePicker(options?: TimePickerOptions)…

银河麒麟V10SP3操作系统-网络时间配置

1、动态网络配置 打开终端&#xff0c;以网口 eth0 为例&#xff1a; nmcli conn add connection.id eth0-dhcp type ether ifname eth0 ipv4.method auto其中“eth0-dhcp”为连接的名字&#xff0c;可以根据自己的需要命名方便记忆和操作 的名字&#xff1b;“ifname eth0”…

CVE-2023-49442 利用分析

1. 漏洞介绍 JEECG(J2EE Code Generation) 是开源的代码生成平台&#xff0c;目前官方已停止维护。JEECG 4.0及之前版本中&#xff0c;由于/api接口鉴权时未过滤路径遍历&#xff0c;攻击者可构造包含 ../ 的url绕过鉴权。攻击者可构造恶意请求利用 jeecgFormDemoController.do…

Redis安装(单机、主从、哨兵、集群)

一、单机安装Redis 首先需要安装Redis所需要的依赖&#xff1a; yum install -y gcc tcl 复制 下载Redis wget https://gitcode.net/weixin_44624117/software/-/raw/master/software/Linux/Redis/redis-6.2.4.tar.gz 复制 创建安装目录 mkdir /usr/local/redis 复制 …

走进AI新时代:织信低代码的实践与启示

最近 AIGC 很火&#xff0c;在各个领域都玩出了一些新花样。 比如在“低代码”领域&#xff0c;可以通过 AI 自动生成一个网站门户。 但这会带来开发效率的提升吗&#xff1f;如果 AI 能快速开发网站、APP等业务应用&#xff0c;那么 AI 生成能否完全取代低代码的可视化配置&a…