3Sum 三數之和
阿新 • • 發佈:2019-01-06
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>> res;
sort(num.begin(), num.end()); //首先排序
for (int k = 0; k < num.size(); ++k)
{
if (num[k] > 0) break; //因為是排好序了,如果num[k]>0,之後一定找不到三個數相加為0;
if (k > 0 && num[k] == num[k - 1]) continue; //跳過相等的兩個數;不需要重複尋找;
int target = 0 - num[k]; //轉換為兩數求和得到target;
int i = k + 1, j = num.size() - 1; //從k位置一直尋找到結束;
while (i < j)
{
if (num[i] + num[j] == target)
{
res.push_back({num[k], num[i], num[j]});
while (i < j && num[i] == num[i + 1]) ++i;//跳過相同的數
while (i < j && num[j] == num[j - 1]) --j;//...
++i; --j; //從兩邊向中間收縮;
}
else if (num[i] + num[j] < target) ++i; //相加的數小了,向右靠;
else --j; //相加的數大了,向左靠;
}
}
return res;
}
};
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>> res;
sort(num.begin(), num.end()); //首先排序
for (int k = 0; k < num.size(); ++k)
{
if (num[k] > 0) break; //因為是排好序了,如果num[k]>0,之後一定找不到三個數相加為0;
if (k > 0 && num[k] == num[k - 1]) continue; //跳過相等的兩個數;不需要重複尋找;
int target = 0 - num[k]; //轉換為兩數求和得到target;
int i = k + 1, j = num.size() - 1; //從k位置一直尋找到結束;
while (i < j)
{
if (num[i] + num[j] == target)
{
res.push_back({num[k], num[i], num[j]});
while (i < j && num[i] == num[i + 1]) ++i;//跳過相同的數
while (i < j && num[j] == num[j - 1]) --j;//...
++i; --j; //從兩邊向中間收縮;
}
else if (num[i] + num[j] < target) ++i; //相加的數小了,向右靠;
else --j; //相加的數大了,向左靠;
}
}
return res;
}
};