题目:
Given an array nums of n integers, are there elements a, b, c in nums 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.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
解法:
先排序,再左右夹逼 方法可以推广到k-sum 先做k-2次循环 在最内层左右夹逼
- 排除特殊情况,如果数量少于3个,或者首元素大于0或者尾元素小于0 直接可以返回 因为不可能三数之和为0
- 外层循环循环到倒数第3个数 固定循环的数为第一个数,如果该数大于0,说明之后的数都大于0,不可能三数之和为0直接退出
- 记得去除重复 然后两段夹逼
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> > res;
sort(nums.begin(), nums.end());
if(nums.size() < 3 || nums.front() > 0 || nums.back() < 0) return res;
for(int i = 0; i < nums.size() - 2; i++){
if(nums[i] > 0) break;
if(i > 0 && nums[i] == nums[i - 1]) continue;
int lo = i + 1;
int hi = nums.size() - 1;
int target = 0 - nums[i];
while(lo < hi){
if(nums[lo] + nums[hi] == target){
res.push_back({nums[i], nums[lo], nums[hi]});
while(lo < hi && nums[lo] == nums[lo + 1]) lo++;
while(lo < hi && nums[hi] == nums[hi - 1]) hi--;
lo++;
hi--;
} else if(nums[lo] + nums[hi] < target){
// while(lo < hi && nums[lo] == nums[lo + 1]) lo++;
lo++;
} else {
//while(lo < hi && nums[hi] == nums[hi - 1]) hi--;
hi--;
}
}
}
return res;
}
};
java:
- Arrays.asList将数组变成List,但是该list只能遍历,不能增加和删除元素,因为该方法实现的是自己的内部类java.util.Arrays.ArrayList,这个内部类没有实现add()、remove()方法,而是直接使用它的父类AbstractList的相应方法。而AbstractList中的add()和remove()是直接抛出java.lang.UnsupportedOperationException异常的
- ArrayList添加方法是add方法
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
if(nums.length < 3 || nums[0] > 0 || nums[nums.length - 1] < 0) return res;
for(int i = 0; i < nums.length - 2; i++){
if(nums[i] > 0) break;
if(i > 0 && nums[i] == nums[i - 1]) continue;
int lo = i + 1;
int hi = nums.length - 1;
int target = 0 - nums[i];
while(lo < hi){
if(nums[lo] + nums[hi] == target){
res.add(Arrays.asList(nums[i], nums[lo], nums[hi]));
while(lo < hi && nums[lo] == nums[lo + 1]) lo++;
while(lo < hi && nums[hi] == nums[hi - 1]) hi--;
lo++;
hi--;
} else if(nums[lo] + nums[hi] < target){
//while(lo < hi && nums[lo] == nums[lo + 1]) lo++;
lo++;
} else {
//while(lo < hi && nums[hi] == nums[hi - 1]) hi--;
hi--;
}
}
}
return res;
}
}
Python:
List添加方法是append方法
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
nums.sort()
if len(nums) < 3 or nums[0] > 0 or nums[-1] < 0: return res
for i in range(len(nums) - 2):
if nums[i] > 0: break
if i > 0 and nums[i] == nums[i - 1]: continue
lo, hi = i + 1, len(nums) - 1
target = 0 - nums[i]
while lo < hi:
if nums[lo] + nums[hi] == target:
res.append((nums[i], nums[lo], nums[hi]))
while lo < hi and nums[lo] == nums[lo + 1]: lo += 1
while lo < hi and nums[hi] == nums[hi - 1]: hi -= 1
lo += 1
hi -= 1
elif nums[lo] + nums[hi] < target:
#while lo < hi and nums[lo] == nums[lo + 1]: lo += 1
lo += 1
else:
#while lo < hi and nums[hi] == nums[hi - 1]: hi -= 1
hi -= 1
return res;