Time Cost
21min16s
Code
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
std::sort(nums.begin(), nums.end());
set<vector<int>> result;
for (int i=0; i<nums.size(); i++) {
// fixed i
int left = i+1, right = nums.size()-1;
while (left < right) {
if (nums[left] + nums[right] < -nums[i]) {
// keep right-forwarding
int prev = nums[left];
do {
left++;
if (nums[left] != prev) break;
} while (left < right);
}else if (nums[left] + nums[right] > -nums[i]) {
// keep left-forwarding
int prev = nums[right];
do {
right--;
if (nums[right] != prev) break;
} while (left < right);
} else {
// same
result.insert({nums[i], nums[left], nums[right]});
int prev = nums[left];
do {
left++;
if (nums[left] != prev) break;
} while (left < right);
prev = nums[right];
do {
right--;
if (nums[right] != prev) break;
} while (left < right);
}
}
}
vector<vector<int>> v(result.begin(), result.end());
return v;
}
};