IT评测·应用市场-qidao123.com
标题:
★ 算法OJ题 ★ 力扣15 - 三数之和
[打印本页]
作者:
乌市泽哥
时间:
2024-9-3 08:22
标题:
★ 算法OJ题 ★ 力扣15 - 三数之和
Ciallo~(∠・ω< )⌒☆ ~ 本日,芝麻凛将和大家一起做一道双指针算法题--三数之和
~
目录
一 标题
二 算法解析
三 编写算法
一 标题
15. 三数之和 - 力扣(LeetCode)
二 算法解析
解法一:排序 + 暴力罗列 + 使用set去重
时间复杂度:O(N^3)
解法二:排序 + 双指针
排序;
固定一个数C(C <= 0);
在该数后面的区间内,使用双指针算法,快速找两个数的和为 -C。
这道题⾥⾯需要有
去重操纵
~
找到⼀个结果之后,
left 和 right 指针要跳过重复的元素
;
当使⽤完⼀次双指针算法之后,
固定的 C 也要跳过重复的元素
。
三 编写算法
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> ret; // 存放结果的顺序表~
sort(nums.begin(), nums.end()); // 排序~
int n = nums.size();
// 固定数i
for (int i = 0; i < n; ) // i的变化需要跳过相同的数,放后面写~
{
if (nums[i] > 0) // 小优化,三个大于0的数加起来不可能等于0~
break;
int left = i + 1, right = n - 1, target = -nums[i];
while (left < right)
{
// 两数之和
int sum = nums[left] + nums[right];
if (sum == target)
{
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--;
}
if (sum < target)
left++;
if (sum > target)
right--;
}
i++;
// 去重,i 跳过相同数,但不能越界
while (i < n && nums[i] == nums[i - 1])
i++;
}
return ret;
}
};
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4