双指针:
时间复杂度O(n2)
空间复杂度O(1)
class Solution {public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int> > res;// 首先将数组排序sort(nums.begin(), nums.end());// 然后有一层for循环,下标i从0开始,确定i的位置后for (int i = 0; i < nums.size(); i++) {// 如果i处元素大于0,那么后边的所有元素也都大于0,直接返回结果if (nums[i] > 0) return res;// 去重if (i > 0 && nums[i] == nums[i-1]) continue;// 将一个左指针定义在i+1的位置上,右指针定义在数组结尾的位置上int l = i + 1, r = nums.size() - 1;// 当两个指针未相遇时,进入while循环while (l < r) {// 去重逻辑如果放在这,会导致l>=r,漏掉[0,0,0]三元组// 如果三个值加起来<0,左指针++,让三数之和大一些if (nums[i] + nums[l] + nums[r] < 0) {l++;// 如果三数之和>0,右指针--,让三数之和小一些} else if (nums[i] + nums[l] + nums[r] > 0) {r--;// 三数之和==0时,将三元组放入vector中} else {res.push_back(vector<int>{nums[i], nums[l], nums[r]});// 去重逻辑应该放在找到一个三元组之后while (l < r && nums[l] == nums[l+1]) l++;while (l < r && nums[r] == nums[r-1]) r--;l++;r--;}}}return res;}};
