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; } };