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:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- 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)
My Code
class Solution {
public:
vector<vector<int> > threeSum(vector<int>& nums) {
vector<vector<int> > results;
int size = nums.size();
if (size < 3)
return results;
sort(nums.begin(), nums.end());
int zero_idx = -1;
for (int i = 0; i < size; i++)
{
if (nums[i] == 0)
{
zero_idx = i;
break;
}
else if (nums[i] > 0)
break;
}
int min_val = nums.front(), max_val = nums.back();
if (min_val > 0 || max_val < 0)
return results;
int last_min_val = min_val - 1;
for (int k = 0; k < size - 2; k++)
{
if (nums[k] == last_min_val)
continue;
if (nums[k] > 0)
break;
int last_mid_val = nums[k] - 1;
int target_val = 0 - nums[k];
for (int i = k + 1; i < size - 1; i++)
{
if (nums[i] == last_mid_val)
continue;
if (nums[i] + nums[i+1] > target_val)
break;
int last_max_val = last_mid_val - 1;
for (int j = i + 1; j < size; j++)
{
if (nums[j] == last_max_val)
continue;
if (nums[i] + nums[j] == target_val)
{
vector<int> result(3, 0);
result[0] = nums[k];
result[1] = nums[i];
result[2] = nums[j];
results.push_back(result);
break;
}
else if (nums[i] + nums[j] > target_val)
break;
last_max_val = nums[j];
}
last_mid_val = nums[i];
}
last_min_val = nums[k];
}
return results;
}
};
Runtime: 64 ms