LeetCode 15. 三数之和
双指针的另一用法,用于解决3sum问题;
时间复杂度位O(n2),有点高;
主题思想:
先进行排序,以减去相同元素的不同组合情况;
设立第一个指针,从前到后遍历;
对于后续区间进行左右两个指针向中间双向遍历,加和三个元素;
乍一看像是三次方复杂度,其实除去第一层,剩下的是On复杂度;
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> a;
if(nums.size()<3)
return a;
sort(nums.begin(), nums.end());
int ss = 0, k = 0, j = 0;
vector<int> tmp;
for (int i = 0; i < nums.size(); i++)
{
if(i>0&&nums[i]==nums[i-1])
continue;
k = i+1; j = nums.size() - 1;
while (k < j) {
if(k>i+1&&nums[k]==nums[k-1]){
k++;
continue;
}
if (nums[i] + nums[j] + nums[k] == 0) {
tmp.clear();
tmp.push_back(nums[i]);
tmp.push_back(nums[k]);
tmp.push_back(nums[j]);
a.push_back(tmp);
k++;
}
else if (nums[i] + nums[j] + nums[k] < 0) {
k++;
}
else {
j--;
}
}
}
return a;
}
};

浙公网安备 33010602011771号