打回现实的一道题
思路:先将数组进行排序
遍历数组,使用left标记i+1,right标记nums.length-1
如果三数之和(nums[i]+nums[left]+nums[right])大于0,right--,如果小于0,left++
注意:1、使用set集合进行去重
2、找到合适的不要break(第一次就错在这里) 要继续找 left++ right--
public static List<List<Integer>> threeSum(int[] nums) {Set<List<Integer>> result=new HashSet<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {int right= nums.length-1;int left=i+1;if(nums[i]>0||(nums[i]==0&&nums[right]>0)){break;}while(left<right){int sum=nums[i]+nums[left]+nums[right];if(sum==0){List<Integer> list=new ArrayList<>();list.add(nums[i]);list.add(nums[left]);list.add(nums[right]);result.add(list);left++;right--;}else if(sum>0){right--;}else {left++;}}}//进行数据去重return new ArrayList<>(result);}