力扣-三数之和
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也是这样求。
浙公网安备 33010602011771号