【leetcode】15.三数之和
程序员文章站
2022-07-15 11:17:06
...
思路:数组遍历,双指针
首先对数组进行排序,排序后固定一个数 nums[i],再使用左右指针指向 nums[i]后面的两端,数字分别为 nums[L] 和 nums[R],计算三个数的和 sum 判断是否满足为 0,满足则添加进结果集
如果 nums[i] == nums[i-1],则说明该数字重复,会导致结果重复,所以应该跳过
当 sum == 0 时,nums[L] == nums[L+1] 则会导致结果重复,应该跳过,L++
当 sum == 0 时,nums[R] == nums[R-1]则会导致结果重复,应该跳过,R–
时间复杂度:O(n^2)
新学的java语法:
数组排序:Arrays.sort(nums);
把数转成list:Arrays.asList(nums[i], nums[j], nums[k]);
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums == null || nums.length<3)
return res;
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++){
int j = i+1;
int k = nums.length-1;
while (j<k){
int sum = nums[i] + nums[j] + nums[k];
if(sum == 0){
res.add(Arrays.asList(nums[i], nums[j], nums[k]));
while (j<k && nums[j+1] == nums[j]) //去重
j++;
while (j<k && nums[k-1] == nums[k]) //去重
k--;
j++;
k--;
}
else if(sum > 0)
k--;
else if(sum < 0)
j++;
}
while (i<nums.length-1 && nums[i+1] == nums[i]) //去重
i++;
}
return res;
}