三数之和
15题三数之和
暴力解法(超出时间限制)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
set<set<int>> s;
int size = nums.size();
for(int i = 1;i<size-1;i++){
for(int j = 0;j<i;j++){
for(int z = i+1;z<size;z++ ){
if(nums[i]+nums[j]+nums[z]==0){
set<int> set;
set.insert(nums[i]);
set.insert(nums[j]);
set.insert(nums[z]);
if(s.count(set)==0){
s.insert(set);
vector<int> tmp = {nums[i],nums[j],nums[z]};
ans.push_back(tmp);
}
}
}
}
}
return ans;
}
};
|
暴力解法会超出时间限制,考虑跳过没有必要的循环检查,先进行排序,在原本暴力求解的基础上进行剪枝。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
// 排序
sort(nums.begin(),nums.end());
vector<vector<int>> ans;
set<set<int>> s;
int size = nums.size();
for(int i = 1;i<size-1;i++){
for(int j = 0;j<i;j++){
for(int z = i+1;z<size;z++ ){
int test = nums[i]+nums[j]+nums[z];
if(test==0){
set<int> set;
set.insert(nums[i]);
set.insert(nums[j]);
set.insert(nums[z]);
if(s.count(set)==0){
s.insert(set);
vector<int> tmp = {nums[i],nums[j],nums[z]};
ans.push_back(tmp);
}
}else if(test>0){
break;
}
}
}
}
return ans;
}
};
|
上述解法不能正确的解决,使用双指针的解法进行求解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 | class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
// 排序
sort(nums.begin(),nums.end());
vector<vector<int>> ans;
set<set<int>> s;
int size = nums.size();
for(int i = 0;i<size&&nums[i]<=0;i++){
int j = i+1,k = size-1;
while(j<k){
int n = nums[j]+nums[k]+nums[i];
if(n<0){
j++;
}else if(n>0){
k--;
}else {
set<int> set;
set.insert(nums[i]);
set.insert(nums[j]);
set.insert(nums[k]);
if(s.count(set)==0){
s.insert(set);
vector<int> tmp = {nums[i],nums[j],nums[k]};
ans.push_back(tmp);
}
j++,k--;
// break;
}
}
}
return ans;
}
};
|