三数之和(双指针法)
问题描述:
// 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
//
// 注意:答案中不可以包含重复的三元组。
//
// 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
//
// 满足要求的三元组集合为:
// [
// [-1, 0, 1],
// [-1, -1, 2]
// ]
//
// 来源:力扣(LeetCode)
// 链接:https://leetcode-cn.com/problems/3sum
// 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解决方案:
对于该问题主要得难点在于去重。
先对该数组原地升序排序。
定义i 为第一个值的下标,left 为第二个值的下标,right为第三个值的下标
i从0到nums.length - 3 依次遍历:
对于每一个i,left初值为i+1,right初值为nums.length - 1
当 left < right时
计算target = nums[i] + nums[left] + nums[right]
当target > 0时说明此时三数之和过大了,right左移
target < 0时,left右移
target == 0说明就是这三个数,但是此时还是不能退出,中间数还是可能存在可行解的。right-- left++
如上只是说了双指针法的大体思路,并未提出去重的解决方案
对于第一个数nums[i],若nums[i] == nums[i - 1],说明这个值之前已经作为第一个数遍历过了 应该跳过这个数,continue即可
对于第二个数nums[left] 若nums[left] == nums[left - 1]同理,跳过这个数即可
第三个数nums[right],若nums[right] == nums[right + 1] 同理
此外由于该数组是排好序的数组,因此dangnums[i] > 0时,意味着i后面的都是大于0的,因此便不存在以nums[i]为第一个数的可行解。整体退出即可。
具体实现代码如下:
public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new LinkedList<>();Arrays.sort(nums);for (int i = 0; i < nums.length - 2; i++) {if(nums[i] > 0) {break;}if(i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.length - 1;while(left < right) {if(left > i + 1 && nums[left] == nums[left - 1]) {left++;continue;}if(right < nums.length - 1 && nums[right] == nums[right + 1]) {right--;continue;}int target = nums[i] + nums[left++] + nums[right--];if (target > 0) {right--;} else if(target < 0) {left++;} else {List<Integer> temp = new LinkedList<>();temp.add(nums[i]); temp.add(nums[left]); temp.add(nums[right]);list.add(temp);}}}return list;}
三数之和(双指针法)相关推荐
- 两数之和——双指针法
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...
- 双指针解决力扣两/三数之和问题
双指针解决力扣两/三数之和问题 文章目录 双指针解决力扣两/三数之和问题 一.问题描述 二.分析 1.暴力 2.排序+双指针法 3.hash法 三.问题描述 四.分析 方法一:排序 + 双指针 五.代 ...
- leetcode No.15-16 三数之和相关问题
leetcode 15. 三数之和 题目 链接:https://leetcode-cn.com/problems/3sum 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...
- leetcode两数之和,三数之和,四数之和问题
1. 两数之和 遍历数组的同时,使用字典(哈希表)记录数对应的索引,对于每一个数nums[i],判断 target-nums[i]是否在字典中,找到一个即返回.若列表中的与元素有重复也可这样处理,因为 ...
- 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和
代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...
- LeetCode15. 三数之和 16. 最接近的三数之和
LeetCode15. 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组 ...
- (补)算法训练第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和
代码随想录算法训练营第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 454.四数相加II 题目链接:四数相加II 参考:https://programmerc ...
- 代码随想录算法训练营day07| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
Leetcode 454.四数相加II 题目链接 思路:求四数相加之和,将四数两两相加,判断两两相加的数是否和为0 定义一个map,key放两数之和,value放两数之和出现的次数 两层for循环将前 ...
- 代码随想录算法训练营15期 Day7 | 454.四数相加II、 383. 赎金信 、15. 三数之和、18. 四数之和
目录 力扣 454.四数相加II 题解:哈希表-map-unordered_map 力扣 383.赎金信 题解1:暴力解法 题解2:哈希表--数组 力扣 454.四数相加II 题目: 给你四个整数数组 ...
最新文章
- C C++的编译过程详解
- 据廖雪峰python3教程----python学习第二天
- Java中对象的销毁
- UIDatePicker | 时间选择器
- 【UVA624 01背包中的路径问题】
- 面向对象基础回顾(二)
- GDCM:gdcm::Parser的测试程序
- IntelliJ IDEA scala的源码设置
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记24 popovers弹窗
- LVS-DR模型实现调度
- 8.2 GOF设计模式一: 单实例模式 SingleTon
- Python制作安卓游戏外挂
- Flutter实战-请求封装(五)之Isolate线程改造
- 如何查看tkinter可用的字体有哪些
- 【MATLAB】调整坐标轴及视野
- html+css模仿微信主页面
- Linux 管理联网 nmcli常用命令
- [android开发必备]Android开发者社区汇总
- 导致请求失败 设备硬件出现致命错误_设备硬件出现致命错误,导致请求失败。请求大神帮忙...
- 电影《诛仙Ⅰ》:“IP加流量的话”现在还可以行得通吗