版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cbb944131226/article/details/82913948
Leetcode15 3Sum(C++)
题目论述
-
链接:
-
概述:
Given an array
nums
of n integers, are there elements a, b, c innums
such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
思考分析
分析一:
三层循环暴力求解。
复杂度O(n^3)
分析二(Solution1):
我们根据之前做的Leetcode16: 3 Sum Closest的思路,将这道三数和问题转化为二数和问题。
- 第一步,因为所求与原始数组下标无关,故放心大胆地先将数组排序。
- 第二步,用一个for循环选出三数中最小的一个数
num[target]
。 - 第三步,用一个while循环从
num[target]
后面的数中,以从两头向中间逼近的方法确定剩下的两个数num[head], num[tail]
,如果num[head] + num[tail] = -num[target]
,那么,(num[target], num[head], num[tail])
就是满足条件的三元组。 - 第四步,按照上述步骤得到的三元组是有重复的,那么我们要优化一下,避免向答案数组中加入重复项。
- 在for循环中,如果
num[target]
与之前的一样的话,那么target++,跳过。 - 在while循环中,我们规定如果找到一个满足条件的
(head, tail)
,head++继续寻找不同的(head, tail)
。那么需要判断head++后,当下的num[head]
与之前的是否相同,相同的话,那么head++,跳过。
- 在for循环中,如果
复杂度O(n^2)
code(c++)
solution (88ms)
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
//sort the array
sort(nums.begin(), nums.end());
//find the answer vector<vector<int>>
vector<vector<int>> answer;
int head, tail;
for(int i = 0; i < (int)nums.size(); i++) {
if(nums[i] == nums[i-1] && i != 0) continue;
head = i + 1;
tail = nums.size()-1;
while(head < tail) {
if(nums[head] + nums[tail] < -nums[i]) head++;
else if(nums[head] + nums[tail] > -nums[i]) tail--;
else {
if(nums[head] == nums[head-1] && head != i+1) {
head++;
continue;
}
answer.push_back({nums[i], nums[head], nums[tail]});
head++;
}
}
}
return answer;
}
};