#题解# 三数之和
三数之和
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711?tpId=295&tqId=731&ru=%2Fpractice%2F50ec6a5b0e4e45348544348278cdcee5&qru=%2Fta%2Fformat-top101%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295
利用互补的性质!!!
class Solution {
public:
// 和两数之和一样,利用互补性质
vector<vector<int> > threeSum(vector<int> &num) {
int size = num.size();
std::vector<std::vector<int>> res;
if (size < 3) {
return res;
}
std::sort(num.begin(), num.end());
for (int i = 0; i < size; ++i) {
if (i != 0 && num[i - 1] == num[i]) {
continue;
}
int left = i + 1;
int right = size - 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;
}
// 来到最后一个重复的数字
++left;
--right;
} else if (num[left] + num[right] > target) {
--right;
} else {
++left;
}
}
}
return res;
}
};