LeetCode:6.三数之和
1.三数之和
对于这道题我们通过三次遍历肯定是可以解决的,但是应该会超时,这道题可以通过双指针来解决,我们可以先对数组进行排序,这样当第一个数大于0的时候就没有结果,同时我们可以将三数之和转化为两数之和,将第一个数设置为aim,在后续的数组中寻找两数之和为-aim,同时因为数组有序,和大于-aim了,就--right,小于就++left
在这里还需要注意一个细节问题,我们的三元组是不能重复的,所以找到一个目标值后需要进行一个去重操作,查看++left, --right,++i后面的值是否相等
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> ret;int n = nums.size();for(int i = 0; i < n; ){if(nums[i] > 0) break;int left = i + 1, right = n - 1;int aim = -nums[i];while(left < right){if(nums[left] + nums[right] > aim) --right;else if(nums[left] + nums[right] < aim) ++left;else{ret.push_back({nums[i], nums[left], nums[right]});++left, --right;while(left < right && nums[left] == nums[left - 1]) ++left;while(left < right && nums[right] == nums[right + 1]) --right;}}i++;while(i < n && nums[i] == nums[i - 1]) i++;}return ret;}
};