1.题目描述
2.题解
i.哈希法
思路与两数之和类似,用两层循环计算两数之和,并存入哈希表中,最后遍历数组找满足大小等于0-(a+b)的元素。而难点还是如何去重的问题
ii.双指针法
首先要对数组进行排序!
遍历存在三种情况:
①nums[i]>0意味着最小值大于零,则该数组不存在三个元素之和为零。
②nums[i]+nums[left]+nums[right]>0意味着三数之和过大,需要将right--使和减小。
③nums[i]+nums[left]+nums[right]<0意味着三数之和过小,需要将left++使和增大。
其次就是依次将满足条件的三数存入表,以及去重操作。
iii.去重操作
对于i指针有两种判断方式,一个是与前一位比较,一个是与后一位比较。 而对于第一种会忽略有重复元素的三元组的情况。
3.代码示例
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) break;//若第一位元素大于零则直接结束循环
if (i > 0 && nums[i] == nums[i - 1]) continue;//对于i去重
int left = i + 1;
int right = nums.length - 1;
while (right > left) {
int sum = nums[i] + nums[left] + nums[right];
if (sum > 0) {
right--;
} else if (sum < 0) {
left++;
} else {
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
while (right > left && nums[right] == nums[right - 1]) right--;//对于right去重
while (right > left && nums[left] == nums[left + 1]) left++;//对于left去重
right--;
left++;
}
}
}
return result;
}
}
4.问题总结
i.对于双指针法为什么要求数组必须要有序?没参透。。。