失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > leetcode刷题 15.三数之和

leetcode刷题 15.三数之和

时间:2023-01-24 17:12:40

相关推荐

leetcode刷题 15.三数之和

分析:

1.特判,对于数组长度 nn,如果数组为 null 或者数组长度小于 33,返回 []。

2.对数组进行排序。

3.遍历排序后数组:

若 nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 0,直接返回结果。对于重复元素:跳过,避免出现重复解令左指针 L=i+1,右指针 R=n−1,当 L<R 时,执行循环:当nums[i]+nums[L]+nums[R]==0,执行循环,判断左界和右界是否和下一位置重复,去除重复解。并同时将 L,R 移到下一位置,寻找新的解若和大于 0,说明 nums[R] 太大,R 左移若和小于 0,说明 nums[L] 太小,L 右移

作者:wu_yan_zu

链接:https://leetcode-/problems/3sum/solution/pai-xu-shuang-zhi-zhen-zhu-xing-jie-shi-python3-by/

来源:力扣(LeetCode)

class Solution {public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ans;if(nums.size()<3) return ans;sort(nums.begin(),nums.end());if(nums[0]>0) return ans;int i=0;while(i<nums.size()){if(nums[i]>0) break;int left = i+1,right = nums.size()-1;while(left<right){long long y = static_cast<long long>(nums[i]);long long x = static_cast<long long>(nums[left]);long long z = static_cast<long long>(nums[right]);if(x+y>0-z)right--;else if(x+y<0-z)left++;else {ans.push_back({nums[i],nums[left],nums[right]});while(left<right&&nums[left]==nums[left+1]) left++;while(left<right&&nums[right] == nums[right-1]) right--;left++;right--;}}while(i+1<nums.size()&&nums[i] == nums[i+1])i++;i++;}return ans;}};

如果觉得《leetcode刷题 15.三数之和》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。