Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4}, A solution set is: (-1, 0, 1) (-1, -1, 2)
思路:本题是典型的k值相加的问题,暴力枚举是每个人都能想到的,但是时间复杂度为o(n^3),太高了,肯定是过不了的,本题可以先对数组排序然后设置一个定点,设置两个指针,一个指向这个定点的下一个位置L,一个指向数组的最后一个位置R,当结果大于target时,R--,当结果小于target时,L++;这样整个算法的时间复杂度是排序的o(nlgn)+o(n^2);
代码如下(已通过leetcode)
public class Solution { List<List<Integer>> lists= new ArrayList<List<Integer>>(); public List<List<Integer>> threeSum(int[] nums) { if(nums==null) return null; int length=nums.length; Arrays.sort(nums); for(int i=0;i<length-2;i++) { if(i>0 && nums[i]==nums[i-1]) continue; findit(nums,i+1,length-1,nums[i]); } return lists; } public void findit(int[] nums,int begin,int end,int target) { int l=begin; int r=end; while(l<r) { if(nums[l]+nums[r]+target==0) { List<Integer> list= new ArrayList<Integer>(); list.add(target); list.add(nums[l]); list.add(nums[r]); lists.add(list); while(l<r && nums[l]==nums[l+1]) l++; while(l<r && nums[r]==nums[r-1]) r--; l++; r--; } else { if(nums[l]+nums[r]+target<0) l++; else r--; } } } }