#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());
// 找出a + b + c = 0
// a = nums[i], b = nums[left], c = nums[right]
for (int i = 0; i < nums.size(); i++) {
// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
if (nums[i] > 0) {
return result;
}
// 错误去重方法,将会漏掉-1,-1,2 这种情况
/*
if (nums[i] == nums[i + 1]) {
continue;
}
*/
// 正确去重方法
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int left = i + 1;
int right = nums.size() - 1;
while (right > left) {
// 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组
/*
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
*/
if (nums[i] + nums[left] + nums[right] > 0) {
right--;
}
else if (nums[i] + nums[left] + nums[right] < 0) {
left++;
}
else {
result.push_back(vector<int>{nums[i], nums[left], nums[right]});
// 去重逻辑应该放在找到一个三元组之后
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
// 找到答案时,双指针同时收缩
right--;
left++;
}
}
}
return result;
}
};
int main(){
Solution a;
vector<int> nums = { -1, 0, 1, 2, -1, -4 };
vector<vector<int>> res;
res=a.threeSum(nums);
int rows = res.size();
for (int i = 0; i < rows; i++){
cout << '[';
for (int j = 0; j < 3; j++){
cout << res[i][j];
if (j != 2) cout << ',';
}
cout << ']' << endl;
}
system("pause");
return 0;
}
二维矩阵行数/列数
我的第一次写的(可通过nums = [-1,0,1,2,-1,-4]示例)
问题是没有去重 无法通过
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
//三个数分别是i left right
//i从0开始 left从i+1开始
int left;
int right = nums.size() - 1;
vector<vector<int>> res;
sort(nums.begin(), nums.end());
for (int i = 0; i<nums.size(); i++){
if (nums[i]>0) return res;
left = i + 1;
while (left<right){
if (nums[i] + nums[left] + nums[right]>0 && left<right){
right--;
}
else if (nums[i] + nums[left] + nums[right]<0 && left<right){
left++;
}
else{
res.push_back(vector<int>{nums[i], nums[left], nums[right]});
right--;
left++;
}
}
}
return res;
}
};
在找到一个三维数组之后去重 加上下面两句
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
又卡了一个新的测试案例
少了很多答案
少答案的原因是right
的定义 不该在while
的外面 这样每次i
和left
变化的时候right
只是在一直减小,没有回到数组的最后
将right
的定义改正后,有卡了一个示例
是因为不光加那两行给left
和right
去重,还要给i
去重
加上
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}