标签:cto 不可 sort 遍历 vector leetcode 总结 执行 int
定义一个三元组为\(a+b+c = 0\),从包含\(n\)个整数的数组中,找出所有满足条件的不重复三元组。
想法1:暴力,\(O(n^3)\)。
想法2:用“桶”记录下每个数值出现的次数,遍历前两个数,判断第三个数是否存在。时间复杂度:\(O(n^2)\),空间复杂度:\(O(n)\)。
想法3:排序 + 双指针。排序后从小到大遍历数组,具体判断情况如下:
nums[i] > 0
,后面不可能有三个数之和为0,结束循环。L = i + 1
,右指针R = n - 1
,当\(L \lt R\)时,执行如下循环:
nums[i] + nums[L] + nums[R] ==0
,判断边界位置是否和下一位置重复,若重复则去重。记录答案,将\(L、R\)移到下一位置。时间复杂度:\(O(n^2)\),空间复杂度:\(O(n)\)。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int len = nums.size();
if(len < 3) return {};
sort(nums.begin(), nums.end());
vector<vector<int>> res;
int L, R;
for(int i = 0; i < len; ++i)
{
if(nums[i] > 0) break;
if(i && nums[i] == nums[i - 1]) continue;
L = i + 1;
R = len - 1;
while(L < R)
{
if(nums[i] + nums[L] + nums[R] == 0)
{
res.push_back({nums[i], nums[L],nums[R]});
while(L + 1 < len && nums[L + 1] == nums[L]) ++L;
while(R - 1 > 0 && nums[R - 1] == nums[R]) --R;
++L; --R;
}
else if(nums[i] + nums[L] + nums[R] > 0)
--R;
else
++L;
// cout << L << ' ' << R << endl;
}
}
return res;
}
};
这种找数字的很多都涉及到了排序,利用有序可以加快查找速度。
标签:cto 不可 sort 遍历 vector leetcode 总结 执行 int
原文地址:https://www.cnblogs.com/songjy11611/p/12330705.html