class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { vector< vector<int> > res; int n = num.size(); //数组元素个数 if(n < 3) return res; //特判,元素不够3个的情况 sort(num.begin(), num.end()); //先对数组元素进行排序 for(int i = 0; i < n-2; i++){ //每轮将第0个到倒数第三个元素作为三元组的第一个元素 if(i != 0 && num[i] == num[i-1]) //后两个元素相同时,无效 continue; //i+1继续验证 int left = i+1, right = n-1; //三元组首元素有效时,从其后面元素中找到左右边界 int target = -num[i]; //用首元素的相反数来验证后两个数是否存在 while(left < right){ if(num[left] + num[right] == target){ //左右两数和为目标值时 res.push_back({num[i],num[left],num[right]}); //加入返回数组中 while(left + 1 < right && num[left] == num[left+1]) left++; //左边有重复的数就跳过, while(right - 1 > left && num[right] == num[right-1]) right--; //右边有重复的数就跳过 right--, left++; //更新左右边界,继续寻找下一对符合要求的元素 } else if(num[left] + num[right] > target) right--; //左右两值和更大时,右边界往左缩 else //左右两数和更小时,左边界往右移 left++; } } return res; } };