题目描述
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:
[[-1, 0, 1],[-1, -1, 2]
]

我的初步思路:利用穷举法加优化来完成,代码如下:

public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new ArrayList<List<Integer>>();if(nums == null || nums.length<3) {return list;}//1.排序Arrays.sort(nums);Set<String> set = new HashSet<String>();StringBuilder sb = new StringBuilder();//2.查找匹配项并去重for(int i=0;i<nums.length-2 && nums[i]<=0;i++) {for(int j=i+1;j<nums.length-1;j++) {for(int k=j+1;k<nums.length;k++) {sb.delete(0, sb.length());if(nums[i] + nums[j] + nums[k] == 0) {String tmp = sb.append(nums[i]).append(nums[j]).append(nums[k]).toString();if(!set.contains(tmp)) {set.add(tmp);list.add(Arrays.asList(nums[i], nums[j], nums[k]));}}}}}return list;}

但是在测试用例输入了一个巨长巨长的数组之后,程序执行时间超出了限制。继续在穷举法上做优化的空间已经不大了。所以考虑使用另一种方法。
改用双指针法,时间勉强达标,代码如下:

public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new ArrayList<List<Integer>>();if(nums == null || nums.length<3) {return list;}//1.排序Arrays.sort(nums);Set<String> set = new HashSet<String>();StringBuilder sb = new StringBuilder();//2.查找匹配项并去重for(int i=0;i<nums.length-2 && nums[i]<=0;i++) {int start =i+1, end = nums.length-1;while(nums[i]<=0 && start<end) {if(nums[i] + nums[start] + nums[end] <0) {start++;}else if (nums[i] + nums[start] + nums[end] >0) {end--;}else {sb.delete(0, sb.length());String tmp = sb.append(nums[i]).append(":").append(nums[start]).append(":").append(nums[end]).toString();if(!set.contains(tmp)) {set.add(tmp);list.add(Arrays.asList(nums[i], nums[start], nums[end]));}end--;}}}return list;}

上面的代码在去重方面明显还有优化空间,翻评论区发现别人的代码,参照优化如下:

public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new ArrayList<List<Integer>>();if(nums == null || nums.length<3) {return list;}//1.排序Arrays.sort(nums);//2.查找匹配项并去重for(int i=0;i<nums.length-2 && nums[i]<=0;i++) {while (i>0 && i<nums.length-2 && nums[i] == nums[i-1])i++;int l =i+1, r = nums.length-1, sum=0-nums[i];while(nums[i]<=0 && l<r) {if(nums[l] + nums[r] < sum) {while ((l<r) && nums[l+1] == nums[l])l++;l++;}else if (nums[l] + nums[r] >sum) {while ((l<r) && nums[r-1] == nums[r])r--;r--;}else {list.add(Arrays.asList(nums[i], nums[l], nums[r]));while ((l<r) && nums[l+1] == nums[l])l++;while ((l<r) && nums[r-1] == nums[r])r--;r--;}}}return list;}

2019-03-06-算法-进化(三数之和)相关推荐

  1. 算法:三数之和(3sum)。

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元 ...

  2. 算法:三数之和(js)

    题目: 力扣 思路:排序+三指针,从小到大排序后,当前指针从第一个元素开始,在当前指针的右边进行首尾指针移动,cur指针指向的值+left指向的值+right指向的值 === 0时,res中存入该组值 ...

  3. leetcode算法题--三数之和

    原题链接:https://leetcode-cn.com/problems/3sum/ 排序+双指针法 先将数列从小到大排序 先选择一个数,这一步时间复杂度为O(n) 在这个数后面的数中用双指针分别从 ...

  4. 算法-----三数之和等于0

    三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件 且不重复的三元组. 注意:答案中不可以包含重 ...

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

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

  6. 代码随想录算法训练营第07天 | LeetCode 454.四数相加2,383. 赎金信,15. 三数之和,18. 四数之和,总结

    LeetCode [454. 四数相加 II] 题目:给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足 ...

  7. 我理解的算法 - 三数之和及两数、三数之和扩展题

    我理解的算法 - 三数之和及两数.三数之和扩展题 LeetCode 15.三数之和 扩展 三数之和变种题 两数之和变种题 LeetCode 15.三数之和 这道题的题目大家自行查看:链接在这 ,题目和 ...

  8. 算法题解(Leetcode 11、15、17、19、20:盛最多水的容器、三数之和、电话号码的字母组合、删除链表的倒数第 N 个结点、有效的括号)

    文章目录 [11. 盛最多水的容器 - 中等 - 9/7](https://leetcode-cn.com/problems/container-with-most-water/) [15. 三数之和 ...

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

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

  10. 代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和。

    代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和. 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 454.四数相加I ...

最新文章

  1. 很久没更新博客了,再发协同开发中SVN使用规范
  2. [MySQL基础]数据库的相关概念
  3. 模板 字段_劲爆新功能:轻流文字识别(OCR)功能支持自定义识别模板啦
  4. 1-5docker私有镜像仓库
  5. SQL Server 执行 字符串
  6. 中国电子云发布专属云CECSTACK 以全栈信创赋能千行百业
  7. svn中文扩展包安装
  8. 身边的逻辑学——简单的真理不简单(2) 无论如何,清晰思考利多于弊
  9. 美化我们的windows xp
  10. idr寄存器、_STM32 GPIO寄存器 IDR ODR BSRR BRR
  11. UE4 相机对焦学习笔记
  12. 汤姆熊游艺厅抓娃娃技巧汇总
  13. Mars3D中无人机航拍的数据想叠加到三维地图上,实现的流程和方法
  14. Word批量转TXT宏
  15. ***虚拟专用网技术
  16. of undifine报错
  17. 乌克兰基辅一世遗修道院起火 现场火光照亮夜空
  18. ESP32-CAM拍照输出RGB565数据,wifi传输到stm32控制tft屏显示拍照图像
  19. ZOJ 1598 Spherical Triangle
  20. 【Orz】喜闻乐见的原创题被虐...

热门文章

  1. mysql数据库rp集群,使用MySQL-Cluster搭建MySQL数据库集群
  2. mysql表 c#实体类,创建基于MySQL表中的C#类
  3. 设置访问权限_【新思考教学者思】李世松:不要对经典设置访问权限
  4. 神PS!老爸把儿子的画作P成现实,看完我笑哭了
  5. 5分钟盗走你的隐私照片,这个全球性漏洞到底有多可怕
  6. 2018年最值得关注的15大技术趋势,区块链将得到更广泛的应用
  7. 课程笔记|吴恩达Coursera机器学习 Week1 笔记-机器学习基础
  8. html省市区选择器代码,js实现一个省市区三级联动选择框代码分享
  9. oracle天数加个随机数,如何给一个表某列加上指定的随机数
  10. java 中符号_谁能告诉我java中符号的用法,见代码