三数之和(找出所有满足条件的集合)
第一种方法:
解题思路:参考两数之和的hash表的思想
第二种方法:
解题思路:排序+双指针
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; if(nums[0]>0||nums[len-1]<0){ return result; } 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]>0){ return result; } 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; } }