题解 | 三数之和
三数之和
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711
#include <algorithm>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型vector
* @return int整型vector<vector<>>
*/
vector<vector<int> > threeSum(vector<int>& num) {
// write code here
sort(num.begin(), num.end());
vector<vector<int> > ret;
if(num.size() <3)
return ret;
for(int i = 0;i <num.size()-2;i++)
{
int j = i+1;
int k = num.size()-1;
while(j < k)
{
if(num[j] + num[k]+num[i] == 0)
{
vector<int> tmp={num[i],num[j],num[k]};
ret.push_back(tmp);
while (num[j+1] == num[j]) {
j=j+1;
}
j=j+1;
while (num[k-1] == num[k]) {
k=k-1;
}
k=k-1;
}
else if(num[j] + num[k]+num[i] > 0)
{
k--;
}
else if(num[j] + num[k]+num[i] < 0)
{
j++;
}
}
while (num[i+1] == num[i]) {
i=i+1;
}
//i=i+1;
}
return ret;
}
// public:
// vector<vector<int>> threeSum(vector<int>& nums) {
// sort(nums.begin(),nums.end());
// vector<vector<int>> ans;
// int n = nums.size();
// for (int i = 0; i < n - 2; i++) {
// int x = nums[i];
// if (i && x == nums[i - 1]) continue; // 跳过重复数字
// if (x + nums[i + 1] + nums[i + 2] > 0) break; // 优化一
// if (x + nums[n - 2] + nums[n - 1] < 0) continue; // 优化二
// int j = i + 1, k = n - 1;
// while (j < k) {
// int s = x + nums[j] + nums[k];
// if (s > 0) {
// k--;
// } else if (s < 0) {
// j++;
// } else { // 三数之和为 0
// ans.push_back({x, nums[j], nums[k]});
// for (j++; j < k && nums[j] == nums[j - 1]; j++); // 跳过重复数字
// for (k--; k > j && nums[k] == nums[k + 1]; k--); // 跳过重复数字
// }
// }
// }
// return ans;
// }
};
查看5道真题和解析