原题链接:15. 三数之和
solution: 排序+双指针
本题是两数之和的升级版,要求解的是数组中不重复的三个数字之和为0的情况。
由题目条件数组长度最大为3000,如果采用朴素的做法时间复杂度为O(n^3),肯定会发生超时现象。因此必须想一种方法进行优化!
对于数组类的题目,显而易见大部分都会采用双指针算法进行优化,可以将朴素的时间复杂度优化一个量级,变为O(n^2)。
本题思路和两数之和类似,既然是求三数之和,首先将数组以从小到大的顺序排序,然后固定一个数nums[i],再利用双指针求解另外两个数nums[j]和nums[k]。
###值得注意的是需要去除重复情况
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
//去重,如果i大于0且i和上一个数字相等就进入下一个循环
if(i && nums[i] == nums[i-1]) continue;
for(int j = i + 1,k = nums.size() - 1;j < k;j++){
if(j > i + 1 && nums[j] == nums[j-1]) continue; //同理去重
while(j < k && nums[i] + nums[j] + nums[k] > 0) k--;
if(j==k) continue;
else if(nums[i] + nums[j] + nums[k] == 0){ //保存满足条件的数
res.push_back({nums[i],nums[j],nums[k]});
}
}
}
return res;
}
};