概述
15. 三数之和
双指针
双指针
关键点1:因为题目目标值为0,所以一定会出现几个数是非正数,利用这个性质,先固定一个值,然后去寻找两个值等于固定这个值的相反数就是所要的答案,利用双指针不断缩小范围另外两个数的范围即可求出答案。
关键点2:题中要求不能出现重复的答案,那么我们需要先保证数组有序,在答案符合要求之后,下一个即将判断的数不能与当前数一致。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
ArrayList<List<Integer>> res = new ArrayList<List<Integer>>();
int n = nums.length;
// 特判
if(n < 3) return res;
Arrays.sort(nums);
// -2 以减少不必要的判断次数
for(int i = 0; i < n - 2; i ++) {
// 下一个值与当前值相同需要跳过
if(i > 0 && nums[i] == nums[i - 1]) continue;
// 当前值>0就不可能三数之和==0
if(nums[i] > 0) break;
// 双指针
int l = i + 1;
int r = n - 1;
// 目标值
int tar = -nums[i];
while(l < r) {
int tmp = nums[l] + nums[r];
if(tmp < tar) {
l ++;
}else if(tmp > tar) {
r --;
}else {
res.add(Arrays.asList(nums[i], nums[l], nums[r]));
// 当前不是最后一个数(|| 第一个数) && 当前数与下一个判断的数相同
while(l < n - 1 && nums[l] == nums[l + 1]) l ++;
while(r > i + 1 && nums[r] == nums[r - 1]) r --;
l ++;
r --;
}
}
}
return res;
}
}
最后
以上就是微笑期待为你收集整理的每日n刷:leetcode15. 三数之和的全部内容,希望文章能够帮你解决每日n刷:leetcode15. 三数之和所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复