每日一练【三数之和】
2023-12-14 02:03:29
一、题目描述
给你一个整数数组?nums
?,判断是否存在三元组?[nums[i], nums[j], nums[k]]
?满足?i != j
、i != k
?且?j != k
?,同时还满足?nums[i] + nums[j] + nums[k] == 0
?。请
你返回所有和为?0
?且不重复的三元组。
注意:答案中不可以包含重复的三元组。
注意重复表示每个元素不能一一对应
二、题目解析
算法思想:排序+双指针
思路:
- 先排序
- 固定一个数a;
- 在该数后面的区间内,利用“双指针算法”快速找到两个的和等于-a即可。
处理细节问题:
1、去重
- 找到一种结果之后,left和right指针要跳过重复元素
- 当使用完一次双指针算法之后,i也需要跳过重复元素
2、不漏
找到一种结果之后,不要“停”,缩小空间,继续寻找
三、原码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> ret;
//1、排序
sort(nums.begin(),nums.end());
//2、利用双指针解决
for(int i = 0;i<nums.size();)
{
int left = i+1;
int right = nums.size()-1;
int target = -nums[i];
while(left < right)
{
if(nums[left] + nums[right] > target)
right--;
else if(nums[left] + nums[right] < target)
left++;
else
{
ret.push_back({nums[i],nums[left],nums[right]});
left++;
right--;
//去重left和right
while(left<right && nums[left] == nums[left-1]) left++;
while(left<right && nums[right] == nums[right+1]) right--;
}
}
//去重i
i++;
while(i<nums.size() && nums[i] == nums[i-1]) i++;
}
return ret;
}
};
文章来源:https://blog.csdn.net/hanwangyyds/article/details/134896972
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!