一、题目描述
- 根据题目要求,求出数组中三个数之和为0的数字组成List,并且答案不能重复
二、代码解析
class Solution { public List<List<Integer>> threeSum(int[] nums) { int n=nums.length; //先进行排序 Arrays.sort(nums); List<List<Integer>> lists = new ArrayList<>(); for (int i=0;i<n-2;i++){ //避免重复 if (i>0&&nums[i-1]==nums[i]) continue; //定义双指针 int left=i+1; int right=n-1; while (left<right){ if (nums[i]+nums[left]+nums[right]>0){ //和大于零就右指针左移 right--; } else if (nums[i]+nums[left]+nums[right]<0){ left++; //和小于零就左指针右移 }else if (nums[i]+nums[left]+nums[right]==0){ List<Integer> integers = new ArrayList<>(); integers.add(nums[i]); integers.add(nums[left]); integers.add(nums[right]); lists.add(integers); //指针继续移动,避免漏掉其他解 right--; left++; //避免重复 while (nums[right]==nums[right+1] &&left<right) right--; while (nums[left]==nums[left-1]&&left<right) left++; } } } return lists; } }
- 首先进行排序,得到有序的数组
- 遍历数组
- 去重复值
- 定义双指针
- 判断三数和,并移动指针
三、改进
class Solution { public List<List<Integer>> threeSum(int[] nums) { int n=nums.length; //先进行排序 Arrays.sort(nums); List<List<Integer>> lists = new ArrayList<>(); if(nums == null || n < 3) return lists; for (int i=0;i<n-2;i++){ if(nums[i] > 0) break; //避免重复 if (i>0&&nums[i-1]==nums[i]) continue; //定义双指针 int left=i+1; int right=n-1; while (left<right){ int sum=nums[i]+nums[left]+nums[right]; if (sum>0) right--;//和大于零就右指针左移 else if (sum<0)left++;//和小于零就左指针右移 else if (sum==0){ lists.add(Arrays.asList(nums[i],nums[left],nums[right])); //避免重复 while (nums[right]==nums[right+1] &&left<right) right--; while (nums[left]==nums[left-1]&&left<right) left++; //指针继续移动,避免漏掉其他解 right--; left++; } } } return lists; } }