力扣-三数之和
class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> list = new ArrayList<List<Integer>>(); if(nums.length<3) return list; Arrays.sort(nums);//首先将数组进行排序 for(int i=0;i<nums.length;i++){ if(i>0&&i<nums.length){ if(nums[i]==nums[i-1]){//去掉第一个数重复的情况 continue; } } int left = i+1; int right = nums.length-1; int sum; while(left<right){ sum = nums[i]+nums[left]+nums[right]; if(sum<0) left++; else if(sum>0) right--; else{ List<Integer> s = new ArrayList<Integer>(); s.add(nums[i]); s.add(nums[left]); s.add(nums[right]); list.add(s); while(left<right&&nums[left]==nums[left+1])//去重 left++; left++; while(left<right&&nums[right]==nums[right-1])//去重 right--; right--; } } } return list; } }
解题思路
首先将数组排序,然后使用三个指针分别代表三个数的下标,i代表第一个数 left=i+1代表第二个书,right=nums.length-1代表第三个数如果这三个数字的和小于0那么left++,若大于0则right--,这里需要注意left的值是小于right的值的,特别注意的是去掉重复值的情况如果当前nums[i]+nums[left]+nums[right]==0;
如果nums[left]==[left+1]则表示下一次left+1时的值依然为0但是这个值是重复的因此我们需要将left的值+1知道不相同时停止,同理right也是这样求。