力扣 15.三数之和(medium)(双指针)

15. 三数之和 - 力扣(LeetCode)

解法一:排序后暴力枚举然后利用set去重

答案中不可以包含重复的三元组,输出的顺序和三元组的顺序并不重要。根据这两点要求我们需要对数组进行排序,排序后三层for循环嵌套遍历数组可以找出所有满足(i != j、i != k 且 j != k ,同时还满足 numsi + numsj + numsk == 0)的三元组,而在这些三元组中,重复的三元组因为数组有序而完全一样(包括顺序)然后把全部的三元组一股脑扔给set容器,set会帮我们完成去重,最后输出结果。时间复杂度O(n^3) (该解法只解释思路,不做具体演示,我们主要学习下面这种解法)

解法二:排序+双指针

算法思路:

1.先对数组排序,令其变为有序,固定左侧i,定义t=-numi,定义left,right指针,l,r分别是其所指向的值,在left,right区间中遍历使l+r=t

2.若l+r>t,right--,若l+r<t,left++,若l+r=t,存储三元组target,left++,ight--。l,r循环直至left>=right

3.然后i++,开始下一轮循环直至i=n(一个小优化:当numi>0时就可以结束循环了,之后不可能有符合条件的三元组)

处理细节问题:

1.去重

当找到符合条件的三元组时,left,right要跳过重复元素s

当使用完一次双指针算法后,i也要跳过重复元素

2.不漏

找到一种结果后不要停,缩小区间继续寻找

3.避免越界(特殊情况)

每次跳过重复元素时都要判断是否越界

代码:

cpp 复制代码
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int n=nums.size();
        vector<vector<int>> a;
        for(int i=0;i<n;)
        {
            if(nums[i] > 0) break; // 小优化
            int left=i+1,right=n-1,t=-nums[i];
            while(left<right)
            {
                if(nums[left]+nums[right]>t)
                right--;
                else if(nums[left]+nums[right]<t)
                left++;
                else
                {
                    //找到一种结果后不要停,缩小区间继续寻找
                    a.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++;
            //i去重
            while(i < n && nums[i] == nums[i - 1]) i++;
        }
        return a;
    }
};
相关推荐
Yuzhiyuxia8 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
UIU1148 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场8 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi8 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David9 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院10 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng10 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~13 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py14 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing14 小时前
LeetCode100 42.接雨水
java·算法·leetcode