LeetCode 15. 三数之和
Posted xiaoXingcode-go
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 15. 三数之和相关的知识,希望对你有一定的参考价值。
题目链接:LeetCode 15. 三数之和
题意:
在给定的数组中,找出三个数(三个数不重复)使得他们相加的和为 0 ,同时答案中不能有重复的答案
解题思路:
完整代码如下:
//双指针做法首先要有序
// 解法一 最优解,双指针 + 排序
func threeSum(nums []int) [][]int
var res [][]int
sort.Ints(nums) //对nums数组进行排序
//认为 i < j < k
for i:=0;i<len(nums);i++ //遍历 i
if i>0 && nums[i] == nums[i-1] //去重
continue
for j,k:=i+1,len(nums)-1 ;j < k ; j++ //同时遍历 j 和 k 结束条件 j,k 相遇
if j > i+1 && nums[j] == nums[j-1] //同样 去重
continue
for j < k-1 && nums[i] + nums[j] +nums[k-1] >=0
//目的是为了找到nums[i] + nums[j] +nums[k] > 0 的最小值
k--
if nums[i] + nums[j] +nums[k]== 0
res = append(res, []intnums[i], nums[j], nums[k])
return res
leetcode(15)三数之和+去重
三数之和
解题思路:排序+双指针
class Solution public List<List<Integer>> threeSum(int[] nums) List<List<Integer>> result = new ArrayList<List<Integer>>(); if(nums.length<=2) return result; List<Integer> item = null; Arrays.sort(nums); int len = nums.length; int zeroCount = 0; Map<Integer,Integer> map = new HashMap<>(); for(int i=0;i<len;i++) if(nums[i]==0) zeroCount++; map.put(nums[i],i); if(zeroCount>=3) item = new ArrayList<>(); item.add(0); item.add(0); item.add(0); result.add(item); int l=0; int r=0; int temp=0; Integer t = 0; for(int i=0;i<len-2;i++) if(nums[i+1]==nums[i]) continue; if(i>0&&nums[i-1]==nums[i]) temp = nums[i]*2; t = map.get(-temp); if(t!=null&&t>i) item = new ArrayList<>(); item.add(nums[i]); item.add(nums[i]); item.add(-temp); result.add(item); l=i+1; r=len-1; while(l<r) if(nums[i]<-nums[l]-nums[r]) while(l<r&&nums[l+1]==nums[l]) l++; l++; else if(nums[i]>-nums[l]-nums[r]) while(l<r&&nums[r-1]==nums[r]) r--; r--; else item = new ArrayList<>(); item.add(nums[i]); item.add(nums[l]); item.add(nums[r]); result.add(item); while(l<r&&nums[l+1]==nums[l]) l++; l++; while(l<r&&nums[r-1]==nums[r]) r--; r--; return result;
以上是关于LeetCode 15. 三数之和的主要内容,如果未能解决你的问题,请参考以下文章