题目大意:给一个数组,选出其中所有的3个数加起来等于0的组合。
python:
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort()
m=len(nums)
a=[]
for i in range(m-2):
j=i+1
k=m-1
while(j<k):
if nums[j]+nums[k]>-nums[i]:
k-=1
elif nums[j]+nums[k]<-nums[i]:
j+=1
else:
if [nums[i],nums[j],nums[k]] not in a:
a.append([nums[i],nums[j],nums[k]])
j+=1
k-=1
while j < k and nums[j] == nums[j - 1]:
j += 1
while j < k and nums[k] == nums[k + 1]:
k -= 1 //确保不会重复计算
return a
思路:肯定是先排序,然后和most water那题类似的用的詹天佑挖隧道。。ijk三个数,对i遍历。j指向i的下一个,k指向最后一个。两边向中间遍历。还要有确保不重复机制append和不重复计算i和相同的下一个i+1的过程。
复杂度o(n*n)。一次循环遍历加上2sum的方法。判断代替一次循环。
c++:
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int> > ret;
ret.clear();
sort(num.begin(),num.end());
for(int i=0; i!=num.size();i++){
if(i > 0 && num[i]==num[i-1])
continue;
int j,k;
j=i+1;
k=num.size()-1;
while(j<k){
if(j>i+1&&num[j]==num[j-1]){
j++;
continue;
}
if(k<num.size()-1&& num[k]==num[k+1]){
k--;
continue;
}
int sum = num[i] + num[j] + num[k];
if(sum>0){
k--;
}else if(sum<0){
j++;
}else{
vector<int> tmp;
tmp.push_back(num[i]);
tmp.push_back(num[j]);
tmp.push_back(num[k]);
ret.push_back(tmp);
j++;
}
}
}
return ret;
}
};
这里面有vector的用法。不用动态申请数组了。push_back的用法。