原题:(此题高频)
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
题意:求所有3个数和为0的可能。
代码和思路:
/*
1.数组排序
2.设指针,设目标int
3.循环,如果相加等于目标数字,化为List加入ArrayList,判断重复。
4.如果大于或小于
*/
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//前后指针的使用大部分要求数组有序
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
for(int i=0;i<nums.length-2;i++){
//如果nums[i]在上一次已经判断过,那么跳过
if(i>0 && nums[i]==nums[i-1]){
continue;
}
//其实是3个指针同时比较,i当前数字,i+1是当前数字的后面一个,还有从最后开始的hi
int lo = i+1;
int hi = nums.length-1;
//要求3个数相加等于0,a+b+c = 0 也就是要求 a+b = -c
int target = -nums[i];
while(lo<hi){
if(nums[lo]+nums[hi]==target){
res.add(Arrays.asList(nums[i],nums[lo],nums[hi]));
lo++;
hi--;
//这里也是跳过重复值,在lo和hi + -过后,如果lo或hi的值还是一样,那么跳过
while(lo<hi && nums[lo] == nums[lo-1]) lo++;
while(lo<hi && nums[hi] == nums[hi+1]) hi--;
}
else if(nums[lo]+nums[hi]<target) lo++;
else hi --;
}
}
return res;
}
}