题:https://leetcode.com/problems/3sum/
题目
求一个数组中,取三个数,使得3个数的和为0。
思路
先排序,然后 i 从左到右 固定 一个target = -nums[i] ,若 nums[i] >0 时,i 就可以不用遍历,因为 这时后面的 两数之和 不可能为 负数。
同时 若有相同的数,那么 若前面已经遍历了后面就不用遍历了。
if(i>0 && nums[i-1] == nums[i])
continue;
同时防止 nums[l] 有相似的 后面有相似的 元素。
while(l < r && nums[l] == nums[l+1])
l++;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList();
Arrays.sort(nums);
for(int i = 0 ;i < nums.length && nums[i]<=0;i++){
int target = -nums[i];
if(i>0 && nums[i-1] == nums[i])
continue;
int l = i + 1,r = nums.length -1;
while(l < r){
if(nums[l] + nums[r] == target){
List<Integer> eRes = new ArrayList();
eRes.add(nums[i]);
eRes.add(nums[l]);
eRes.add(nums[r]);
res.add(eRes);
while(l < r && nums[l] == nums[l+1])
l++;
while(l < r && nums[r] == nums[r-1])
r--;
l++;
r--;
}else if(nums[l] + nums[r] < target )
l++;
else
r--;
}
}
return res;
}
}