3Sum
(原题链接:点击打开链接)
Given an array S of n integers, are there elements a, b, c in S 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.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
Solution:
固定前两个数字,动态寻找第三个,结果超时了。
#include<algorithm>
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
if (nums.size() < 3)
{
//result.push_back(nums);
return result;
}
vector<int> local(3);
int p = nums.size() - 1;//指示nums最后一位
sort(nums.begin(),nums.end()); //对nums进行排序
for (int a = 0; a < nums.size() - 2; a++)
{
for (int b = a + 1; b < p; b++)
{
for (int k = p; k > b; k--){
if (nums[a] + nums[b] + nums[k] == 0)
{
local[0] = nums[a];
local[1] = nums[b];
local[2] = nums[k];
int repeat = 0;
for (int c = 0; c < result.size(); c++)
{
if (local == result[c])
{
repeat = 1;
break;
}
}
if (!repeat) result.push_back(local);
p = k;
break;
}
else if (nums[a] + nums[b] + nums[k] > 0) p--;
}
}
p = nums.size() - 1;
}
return result;
}
};
只固定第一个数字,动态寻找第二和第三个数字,时间复杂度为O(N^2)
#include<algorithm>
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
if (nums.size() < 3)
{
//result.push_back(nums);
return result;
}
vector<int> local(3);
int back = nums.size() - 1;//指示nums最后一位
int front = 1;
sort(nums.begin(),nums.end()); //对nums进行排序
for (int a = 0; a < nums.size() - 2; a++)
{
front = a + 1;
back = nums.size() - 1;
while (front < back)
{
if (nums[a] + nums[front] + nums[back] == 0)
{
local[0] = nums[a];
local[1] = nums[front];
local[2] = nums[back];
result.push_back(local);
front++;
while(front<back && nums[front] == local[1]) front++;
back--;
while(front<back && local[2] == nums[back]) back--;
}
else if (nums[a] + nums[front] + nums[back] > 0)
{
back--;
}
else
{
front++;
}
}
while(a < nums.size() - 2 && nums[a] == nums[a+1]) a++;
}
return result;
}
};