给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组
这题一直卡在了时间限制上,可能是由于之前在处理重复问题的方法太笨了。之前是把所有可能组合找出然后在去掉重复的可能,花了太多不必要的时间,尤其是在测试案例里存在很大的数的情况。后来把处理重复的情况直接在遍历过程中解决就好了很多。
python:
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums = sorted(nums)
n = len(nums)
res = []
if n < 3 or nums[0]>0:
return res
for k in range(n-2):
if nums[k] > 0:
break
if k > 0 and nums[k-1]==nums[k]:
continue
first = nums[k]
i = k+1
j = n-1
while i<j:
if nums[i]+nums[j] > (-first):
j -= 1
elif nums[i]+nums[j] < (-first):
i += 1
elif nums[i]+nums[j] == (-first):
temp = []
temp.append(first)
temp.append(nums[i])
temp.append(nums[j])
res.append(temp)
while i<j and nums[i] == nums[i+1]:
i += 1
while i<j and nums[j] == nums[j-1]:
j -= 1
j -= 1
i += 1
return res
C++:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n = nums.size();
vector<vector<int>> res;
if(n < 3) return res;
for(int k = 0;k < (n-2);k++){
if(nums[k] > 0) break;
if((k > 0) && (nums[k] == nums[k-1])) continue;
int i = k + 1;
int j = n - 1;
while(i < j){
if((nums[i] + nums[j]) > (-nums[k])) j -= 1;
else if((nums[i] + nums[j]) < (-nums[k])) i += 1;
else if((nums[i] + nums[j]) == (-nums[k])){
vector<int> temp;
temp.push_back(nums[k]);
temp.push_back(nums[i]);
temp.push_back(nums[j]);
res.push_back(temp);
while((i < j) && (nums[i] == nums[i+1])) i += 1;
while((i < j) && (nums[j] == nums[j-1])) j -= 1;
i += 1;
j -= 1;
}
}
}
return res;
}
};