三数之和
解题思路:排序+双指针
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; } }
原文地址:https://www.cnblogs.com/erdanyang/p/11091352.html
时间: 2024-10-09 13:26:06