更多LeetCode题解
My Solution
TLE
//O(n^3), TLE
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res = {};
for (size_t i = 0; i < nums.size(); i++) {
for (size_t j = i + 1; j < nums.size(); j++) {
for (size_t k = j + 1; k < nums.size(); k++) {
if (nums[i] + nums[j] + nums[k] == 0) {
res.push_back({ nums[i],nums[j],nums[k] });
}
}
}
}
for (vector<int>& v : res) {
sort(v.begin(), v.end());
}
sort(res.begin(), res.end());
res.erase(unique(res.begin(), res.end()), res.end());
return res;
}
};
simplified
still TLE.
在简化了代码之后,采用双指针的方式查找,时间复杂度应该降到
O
(
n
2
)
O(n^2)
O(n2)才对,然而仍然超时,因此,怀疑是去重部分代码超时。
//TLE
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
if (nums.size() < 3) {
return res;
}
sort(nums.begin(), nums.end());
for (size_t i = 0; i < nums.size() - 2; i++) {
int target = 0 - nums[i];
size_t j = i + 1, k = nums.size() - 1;
while (j < k) {
int sum = nums[j] + nums[k];
if (sum < target) {
j++;
}
else if (sum > target) {
k--;
}
else {
res.push_back({ nums[i], nums[j], nums[k] });
j++;
}
}
}
//May be this part TLE.
sort(res.begin(), res.end());
res.erase(unique(res.begin(), res.end()), res.end());
return res;
}
};
在寻找的过程中去重
AC
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
if (nums.size() < 3) {
return res;
}
sort(nums.begin(), nums.end());
for (size_t i = 0; i < nums.size() - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) { continue; }
int target = 0 - nums[i];
size_t j = i + 1, k = nums.size() - 1;
while (j < k) {
int sum = nums[j] + nums[k];
if (sum < target) {
j++;
}
else if (sum > target) {
k--;
}
else {
res.push_back({ nums[i], nums[j], nums[k] });
j++; k--;
while (k > j && nums[j] == nums[j - 1]) {
j++;
}
while (k > j && nums[k] == nums[k + 1]) {
k--;
}
}
}
}
return res;
}
};