题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
我的思路
理所当然,暴力解决是我想到的第一个方法,用代码尝试了一下,但在处理一些特殊用例时怎么也解决不了问题,可能我的想法是有问题的。于是,参考了一下别人的代码,才得以解决问题。代码不难,关键在思维。
再接再厉。
参考
我的代码实现
//
// Created by HINTS on 2018/12/13.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> threeSum(vector<int>& nums) {
if(nums.empty() || nums.size() < 3)
return {};
vector<vector<int>> res;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 2; ++i) {
if(i == 0 || (i > 0 && nums[i] != nums[i-1])){
int lo = i + 1, hi = nums.size() - 1, sum = 0 - nums[i];
while (lo < hi){
if(nums[lo] + nums[hi] == sum){
res.push_back({nums[i], nums[lo], nums[hi]});
while(lo < hi && nums[lo] == nums[lo+1]) lo++;
while(lo < hi && nums[hi] == nums[hi-1]) hi--;
lo++;
hi--;
}else if(nums[lo] + nums[hi] < sum)
lo++;
else
hi--;
}
}
}
return res;
}
int main011(){
vector<int> nums = {-1,0,1,2,-1,-4};
vector<vector<int >> res = threeSum(nums);
return 0;
}