首先考虑两数之和==target问题
vector<int> twoSum(vector<int>& nums, int target) {
// 先对数组排序
sort(nums.begin(), nums.end());
// 左右指针
int lo = 0, hi = nums.size() - 1;
while (lo < hi) {
int sum = nums[lo] + nums[hi];
// 根据 sum 和 target 的比较,移动左右指针
if (sum < target) {
lo++;
} else if (sum > target) {
hi--;
} else if (sum == target) {
return {nums[lo], nums[hi]};
}
}
return {};
}
那么三数之和无非就是先确定第一个数first,再求剩下两数之和等于0-first.注意要求不重复,所以先要排序,排序后只要每次确定的first值以及left值不能跟之前取的重复即可,为什么只用保证这两个不重复?因为三数确定两个不重复,第三个必然不重复,(在排过序的情况下)
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
if(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 && nums[i] == nums[i - 1]) {
continue;
}//i为第一个数,后续第一个数不能跟上一个取的一致,因为是排过序的数,所以必然会导致重复
int left=i+1,right=nums.size()-1;
int twosum=-nums[i];
while(left<right){//left为第二个数,right为第三个数
if (left >i + 1 && nums[left] == nums[left - 1]) {//第二个数取的不能跟上次取的一致,因为是排过序的数,所以第三个数必然会导致重复
left++;
continue;
}
if(nums[left]+nums[right]<twosum) left++;
else if(nums[left]+nums[right]>twosum)right--;
else {
res.push_back({nums[i],nums[left],nums[right]});
left++;
right--;
}
}
}
return res;
}
};
版权声明:本文为qq_41884662原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。