题目大意就是给你一个数组,从里面找出三个数字,使这三个数字的和为0。
通过先排序,枚举第一个数字a,然后可以通过前后夹逼的方法,找到两个数字b,c。使b + c = -a。那么这三个即符合题意,需要注意的是,去除重复元素。自己写的用set,感觉有点蠢。。。, 时间复杂度有点高,300多ms过的。
class Solution
{
public:
vector<vector<int> > threeSum(vector<int>& nums)
{
set<vector<int> > st;
sort(nums.begin(), nums.end());
for(int i=0; i<nums.size(); ++ i)
{
int t = -nums[i];
int b = i + 1, e = nums.size() - 1;
while(b < e)
{
int sum = nums[b] + nums[e];
if(sum < t)
b ++;
else if(sum > t)
e --;
else
{
st.insert(vector<int> {nums[i], nums[b], nums[e]});
b ++, e --;
}
}
}
vector<vector<int> > vec;
for(auto it = st.begin(); it != st.end(); ++ it)
vec.push_back(*it);
return vec;
}
};
后来观看别人代码,100多ms
class Solution
{
public:
vector<vector<int> > threeSum(vector<int>& nums)
{
sort(nums.begin(), nums.end());
vector<vector<int> >vec;
for(int i=0; i<nums.size(); ++ i)
{
int t = -nums[i];
int b = i + 1, e = nums.size() - 1;
while(b < e)
{
int sum = nums[b] + nums[e];
if(sum < t)
b ++;
else if(sum > t)
e --;
else
{
int y = nums[b], z = nums[e];
vec.push_back(vector<int> {nums[i], nums[b], nums[e]});
b ++, e --;
while(b < e && nums[b] == y)
b ++;
while(b < e && nums[e] == z)
e --;
}
}
while(i+1 < nums.size() && nums[i] == nums[i+1])
i ++;
}
return vec;
}
};