LeetCode 三数之和 — 改进解法

题目:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[ [-1, 0, 1], [-1, -1, 2] ]

 最开始做的解法是先将整个数组排序;然后遍历前两个数(a和b)的所有情况(n^2);对于第三个数,则从剩余的数中(即从第二个数下一个位置开始到末尾)利用二分查找出是否存在数字 -(a+b)即可。 复杂度O(n^2·logn) :

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ans = new ArrayList<List<Integer>>();Arrays.sort(nums);Map<Integer,Integer> mi = new HashMap();for(int i=0;i<nums.length-1;i++) {if(mi.get(nums[i]) != null) continue; //记录i下标读过的数字mi.put(nums[i],1);Map<Integer,Integer> mj = new HashMap();    for(int j=i+1;j<nums.length;j++) {if(mj.get(nums[j]) != null) continue; //记录j下标读过的数字mj.put(nums[j],1);int temp = -(nums[i]+nums[j]);if(bSearch(nums,j+1,nums.length-1,temp) == false) continue; //二分搜索j下标之后的区间是否有数字tempans.add(Arrays.asList(nums[i],nums[j],temp));}}return ans;}//二分算法public boolean bSearch(int[] nums,int s,int e,int key) {int start=s,end=e,mid;while(start<=end){mid = (start+end)/2;if(key < nums[mid]) end=mid-1;else if(key > nums[mid]) start=mid+1;else if(key == nums[mid]) return true;}return false;}
}

里面有两个用了哈希的地方,所以时间复杂度应该还要乘上一个常数K...(解数组相关的题感觉总有些依赖哈希的方法=_= ...)


 最近做了另一个数组区间相关的题目,受其解法的启发,打算对这道题解法进行优化。
 还是先对数组进行排序;对第一个数字(a)进行遍历,而然后在剩余的数中用前后指针的方法找出两个和为-a的数字:两个指针left和right;left初始化为数字a的下一位置,right为最后一个位置。比较nums[left]+nums[right]+a和0的大小;如果大于0则right--,小于就left++。 其中在添加结果集时需考虑去重问题,用个哈希判断是否有重复就行了,复杂度O(n^2·K) :

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ans = new ArrayList<List<Integer>>();Arrays.sort(nums);Map<Integer,Integer> mi = new HashMap();for(int i=0;i<nums.length-2;i++) {if(mi.get(nums[i]) != null) continue; //记录i下标读过的数字mi.put(nums[i],1);Map<Integer,Integer> mj = new HashMap();int l = i+1, r = nums.length-1, temp;while(l<r) {temp = nums[i] + nums[l] + nums[r];if(temp < 0) {l++;} else if(temp > 0) {r--;} else {if((mj.get(nums[l])) == null) {ans.add(Arrays.asList(nums[i], nums[l], nums[r]));mj.put(nums[l], 1);}l++; r--;}}}return ans;}
}

转载于:https://www.cnblogs.com/geek1116/p/10172313.html

LeetCode 三数之和 — 优化解法相关推荐

  1. leetcode三数之和 M015

    leetcode M015 三数之和解法的本质就是暴力循环 方法一.纯暴力 原始的暴力循环N^3时间复杂度,代码如下: 很显然超时了 def threeSum(self, nums: List[int ...

  2. 最接近的三数之和Python解法

    给你一个长度为 n 的整数数组 nums 和 一个目标值 target.请你从 nums 中选出三个整数,使它们的和与 target 最接近. 返回这三个数的和. 假定每组输入只存在恰好一个解. 来源 ...

  3. Leetcode 三数之和

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

  4. leetcode ---- 三数之和

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

  5. leetcode 三数之和 python_16.leetcode题目讲解(Python):最接近的三数之和

    题目如下: 题目 这道题可以用排一些特殊情况,减少计算量, 参考代码如下: class Solution: def threeSumClosest(self, nums, target): " ...

  6. 【LeetCode】两数之和、三数之和、四数之和系列

    文章目录 两数之和★ 三数之和★★ 四数之和★★ 四数相加Ⅱ★★ 最接近的三数之和★★ 此篇文章总结下力扣中的两数之和.三数之和.四数之和及一系列求数组中满足达到目标值的元组个数的问题,仔细阅读下面的 ...

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

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

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

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

  9. LeetCode 15三数之和16最接近的三数之和

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

最新文章

  1. Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)...
  2. Spring---rabbitmq生产者配置
  3. OpenNebula学习第三节之虚拟机管理
  4. docker+selenium web自动化测试环境的部署
  5. 十字星文化获数千万元A轮融资,腾讯持续下注
  6. 成都Uber优步司机奖励政策(3月28日)
  7. hive与hbase数据类型对应关系
  8. linux内核 3.1,快更新:Linux新内核发布 支持USB3.1!
  9. Android: android 如何预置APK
  10. webapi mvc 基础
  11. Java中的指针---Unsafe应用解析
  12. HD2做Windows Phone 7开发机小记(上)
  13. 书matlab电子,MATLAB电子仿真与应用教程 第3版.pdf
  14. telink泰凌微 8266 8250 8258IO中断唤醒睡眠
  15. 腾讯云海外音视频技术架构 — 挑战和优化
  16. Google Chrome73~81版本浏览器的跨域问题解决方案
  17. 谷歌手机地图中文java_谷歌地图开发(1)使用MapView显示地图
  18. 聚类算法(4)--Hierarchical clustering层次聚类
  19. 蛙跳算法 c语言,罗永浩2020直播带货成绩正式公布
  20. 如何解决Mac上网速度很慢的问题(多种可能分析)

热门文章

  1. 实例38:python
  2. 全局scss封装引入背景图片路径报错
  3. python 除数总是提示为0_python负数求余不正确?——取模 VS 取余
  4. 正弦定理和余弦定理_那些让你加快解题速度的高中数学公式-26 利用三正弦、三余弦定理快速解题...
  5. Guitar Por如何演奏刮弦
  6. beego——模板处理
  7. 41、OrthoMCL和mcl软件进行基因家族分析
  8. HDU 4487 Maximum Random Walk
  9. myeclipse使用git图文教程
  10. 基于wordpress搭建网站和基于nodejs自己搭建