//1、for循环一遍,找到第一个数a
//2、标记后面的数组的最左边为left,最右边为right
//3、left与right指针相互靠近,依次判断num[left]+right[right]==-a
//4、O(n^2)
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
set<vector<int>> num_set;
sort(nums.begin(), nums.end(), [](const int &a, const int &b) {return a < b; });
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] > 0)break;//大于零的数,后面的肯都都是大于零,无需再判断,因为没法累加为0
if (i > 0 && nums[i] == nums[i - 1])continue;//重复数字忽略
int left = i + 1;
int right = nums.size() - 1;
int remainNums = -nums[i];
while (left < right)
{
if (remainNums == nums[left] + nums[right]) {
num_set.insert({ nums[i], nums[left], nums[right] });
//{...}//initializer_list//C++11
++left;
--right;
}
else if (remainNums < nums[left] + nums[right]) {
--right;
}
else {
++left;
}
}
}
return vector<vector<int>>(num_set.begin(), num_set.end());
}
};
LeetCode. 三数之和(经典)
最新推荐文章于 2022-03-16 09:23:22 发布