问题描述:

//    给定一个包含 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;}

三数之和(双指针法)相关推荐

  1. 两数之和——双指针法

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  2. 双指针解决力扣两/三数之和问题

    双指针解决力扣两/三数之和问题 文章目录 双指针解决力扣两/三数之和问题 一.问题描述 二.分析 1.暴力 2.排序+双指针法 3.hash法 三.问题描述 四.分析 方法一:排序 + 双指针 五.代 ...

  3. leetcode No.15-16 三数之和相关问题

    leetcode 15. 三数之和 题目 链接:https://leetcode-cn.com/problems/3sum 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...

  4. leetcode两数之和,三数之和,四数之和问题

    1. 两数之和 遍历数组的同时,使用字典(哈希表)记录数对应的索引,对于每一个数nums[i],判断 target-nums[i]是否在字典中,找到一个即返回.若列表中的与元素有重复也可这样处理,因为 ...

  5. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  6. LeetCode15. 三数之和 16. 最接近的三数之和

    LeetCode15. 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组 ...

  7. (补)算法训练第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和

    代码随想录算法训练营第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 454.四数相加II 题目链接:四数相加II 参考:https://programmerc ...

  8. 代码随想录算法训练营day07| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

    Leetcode 454.四数相加II 题目链接 思路:求四数相加之和,将四数两两相加,判断两两相加的数是否和为0 定义一个map,key放两数之和,value放两数之和出现的次数 两层for循环将前 ...

  9. 代码随想录算法训练营15期 Day7 | 454.四数相加II、 383. 赎金信 、15. 三数之和、18. 四数之和

    目录 力扣 454.四数相加II 题解:哈希表-map-unordered_map 力扣 383.赎金信 题解1:暴力解法 题解2:哈希表--数组 力扣 454.四数相加II 题目: 给你四个整数数组 ...

最新文章

  1. C C++的编译过程详解
  2. 据廖雪峰python3教程----python学习第二天
  3. Java中对象的销毁
  4. UIDatePicker | 时间选择器
  5. 【UVA624 01背包中的路径问题】
  6. 面向对象基础回顾(二)
  7. GDCM:gdcm::Parser的测试程序
  8. IntelliJ IDEA scala的源码设置
  9. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记24 popovers弹窗
  10. LVS-DR模型实现调度
  11. 8.2 GOF设计模式一: 单实例模式 SingleTon
  12. Python制作安卓游戏外挂
  13. Flutter实战-请求封装(五)之Isolate线程改造
  14. 如何查看tkinter可用的字体有哪些
  15. 【MATLAB】调整坐标轴及视野
  16. html+css模仿微信主页面
  17. Linux 管理联网 nmcli常用命令
  18. [android开发必备]Android开发者社区汇总
  19. 导致请求失败 设备硬件出现致命错误_设备硬件出现致命错误,导致请求失败。请求大神帮忙...
  20. 电影《诛仙Ⅰ》:“IP加流量的话”现在还可以行得通吗

热门文章

  1. 如新:扎根中国,坚守使命,迈向新未来
  2. sql server msde 的安装及管理
  3. 数据字典例题,数 据 流 图(系统逻辑功能的图形) ——概念和符号,数据字典用途
  4. 数值计算:牛顿迭代法(x的平方根)
  5. 一个汉字占多少字节?
  6. C语言execlp函数
  7. 适配移动端配置px2rem(自动将px转rem)
  8. Vue.js Element入门
  9. Proud Merchants
  10. DNS正向域名解析之bind