专题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.hqwc.cn/news/518637.html

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

相关文章

驱动开发面试复习

创建字符设备 1 创建设备号 alloc_chrdev_region 2.创建cdev cdev_init 3.添加一个 cdev,完成字符设备注册到内核 cdev_add 4.创建类 class_create 5.创建设备 device_create 1.内核空间与用户空间数据 copy_from_user 和copy_to_user 俩个函数来完成。 copy_from_user 函数…

如何提高项目成功率?分享20 种项目管理工具、技术和软件

本文将分享20种项目管理常用的工具、技术和软件&#xff0c;比如项目管理软件 PingCode、Worktile、Redmine、Jira、SAP、PrimaveraSystems等&#xff1b;项目计划阶段工具和技术WBS、甘特图、PERT图、风险评估矩阵等等。 项目管理是确保项目成功交付的关键&#xff0c;它涉及到…

Java实现JT/T808以及T/GDRTA002-2020车辆协议对接

简介 JT/T808,道路运输车辆卫星定位系统终端通信协议及数据格式,本标准规定了道路运输车辆卫星定位系统车载终端与监管/监控平台之间的通信协议与数据格式 , 包括协议基础、通信连接、消息处理、协议分类与要求及数据格式。 T/GDRTA002-2020,道路运输车辆智能视频监控报警系…

CCF-B推荐会议 Euro-Par‘24延期10天! 3月25日截稿!抓住机会!

会议之眼 快讯 第30届Euro-Par(International European Conference on Parallel and Distributed Computing)即国际欧洲并行和分布式计算会议将于 2024 年 8月26日-30日在西班牙马德里举行&#xff01;Euro-Par是欧洲最主要的会议之一&#xff0c;提供了一个广泛而综合的平台&a…

vue3中的生命周期有哪些和怎么使用?

目录 前言&#xff1a; 正文&#xff1a; 总结: 前言&#xff1a; Vue.js 3是Vue.js框架的最新主要版本&#xff0c;引入了一些重大的改变和增强。在Vue 3中&#xff0c;由于Composition API的引入&#xff0c;生命周期钩子被替换为生命周期函数。 正文&#xff1a; 以下是…

中大型工厂人员定位系统源码,实现人、车、物的实时位置监控

UWB高精度定位系统源码&#xff0c;中大型工厂人员定位系统&#xff0c;实现人、车、物的实时位置监控 UWB高精度定位系统源码&#xff0c;智慧工厂人员定位系统源码&#xff0c;基于VueSpring boot前后端分离架构开发的一套UWB高精度定位系统源码。有演示。 随着经济的高速发展…

三八妇女节智慧花店/自动售花机远程视频智能监控解决方案

一、项目背景 国家统计局发布的2023年中国经济年报显示&#xff0c;全年社会消费品零售总额471495亿元&#xff0c;比上年增长7.2%。我国无人零售整体发展迅速&#xff0c;2014年市场规模约为17亿元。无人零售自助终端设备市场规模超过500亿元&#xff0c;年均复合增长率超50%。…

2023年全国职业院校技能大赛软件测试赛题第8套

2023年全国职业院校技能大赛 软件测试赛题第8套 赛项名称: 软件测试 英文名称: Software Testing 赛项编号: GZ034 归属产业: 电子与信息大类 赛项组别: 高等职业教育 …

应用案例 | Softing echocollect e网关助力汽车零部件制造商构建企业数据库,提升生产效率和质量

为了提高生产质量和效率&#xff0c;某知名汽车零部件制造商采用了Softing echocollect e多协议数据采集网关——从机器和设备中获取相关数据&#xff0c;并直接将数据存储在中央SQL数据库系统中用于分析处理&#xff0c;从而实现了持续监控和生产过程的改进。 一 背景 该企业…

2024年5月软考中级《系统监理师》报名考试全攻略

​2024年软考信息系统监理师考试报名时间节点&#xff1a; 报名时间&#xff1a;上半年3月18日到4月15日&#xff0c;下半年8月19日到9月15日&#xff08;各地区报名时间不同&#xff0c;具体日期见官方通告&#xff09; 准考证打印时间&#xff1a;上半年5月20日起&#xff…

DxO ViewPoint:摄影师的最 佳拍档,记录世界的每一刻精彩 mac/win版

DxO ViewPoint是一款革命性的摄影软件&#xff0c;它以其独特的功能和卓越的性能&#xff0c;重新定义了摄影体验。这款软件不仅提供了丰富的摄影工具&#xff0c;还通过先进的算法和技术&#xff0c;让摄影师能够轻松捕捉、管理和展示他们的作品。 DxO ViewPoint 软件获取 Dx…

网络空间资产安全解决方案

长期以来&#xff0c;我们一直强调要做好网络安全建设&#xff0c;而其中的第一步就是要做好对自身资产的发现和清点&#xff0c;正如大家经常所说的那句话——“你无法保护你看不见的东西”。的确&#xff0c;如果不知道自己拥有什么资产&#xff0c;那么如何去了解与它们相关…