力扣15 三数之和
三数之和


思路
-
这是一道双指针的题,时间复杂度为O(n2)。空间复杂度为O(1)。
-
最开始我以为是一个组合问题,用到dfs,但是无法找出重复的,而且时间复杂度极高,所以思路很重要。
细节
- 对于 if else if else 的格式,顺序很重要,要把大概率出现的放在最开始,能极大地加快速度。
- 对于特殊情况,单列出来 比方说第一个数组
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
ArrayList<List<Integer>> res = new ArrayList();
//定义第一个指针 start
int start = 0;
//自带的双轴快排
Arrays.sort(nums);
//循环遍历数组第一个位置的指针,注意终止条件,防止数组越界。
while(start<=nums.length-3){
if(nums[start]>0)break;
//排除了特殊的例子(数组第一个数就大于零的话直接pass,对比测试了一下加这个能快1ms)
//定义第二指针left,刷新第三指针end为最末尾,设置目标值target
int end = nums.length-1;
int target = -nums[start];
int left = start+1;
//内部双指针
while(left<end){
//小于目标值 left++
if(nums[left]+nums[end]<target){ left++;}
//大于目标值 end--
else if(nums[left]+nums[end]>target){end--;}
//等于目标值 加入list,同时剔除相同的元素。
else{
res.add(Arrays.asList(-target, nums[left], nums[end]));
while(left<end&&nums[left+1]==nums[left]){left++;}
left++;
while(left<end&&nums[end-1]==nums[end]){end--;}
end--;
}
}
//如果遇到相同的元素,跳过。
while(start<end&&nums[start+1]==nums[start]){start++;}
start++;
}
return res;
}
}

浙公网安备 33010602011771号