三数之和
思路
暴力解法,嵌套三层循环可以求解,但会超时。
考虑二数之和哈希表法,无果。
总结
考虑到题目要求返回数值而非下标。题解采用了先排序,固定一个值,双指针首尾来查找剩下的值,因为排序过后,收尾双指针可以根据总和sum的大小来改变位置。关键点在于值的去重依靠排序前后两个值是否相同进行判断。
看了思路后,写完代码还是有许多问题,漏了外部去重、代码提前剪枝等问题。
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> lists=new ArrayList<>();
int len= nums.length;
if (len<3 || nums==null) return lists;
Arrays.sort(nums);
for(int i=0;i<len;i++){
int temp=nums[i];
if (temp>0) break; //如果大于0则不存在
if (i>0 && nums[i]==nums[i-1]) continue; //去重
int L=i+1;
int R=len-1;
while (L < R){
int sum=temp+nums[L]+nums[R];
if (sum<0 ) L++;
else if (sum>0) R--;
else if (sum==0){
lists.add(Arrays.asList(temp,nums[L],nums[R]));
while (L < R && nums[L]==nums[L+1]) L++; //去重
while (L < R && nums[L]==nums[R-1]) R--;
L++; R--;
}
}
}
return lists;
}
}