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

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

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

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

解法二:排序+双指针

算法思路:

1.先对数组排序,令其变为有序,固定左侧i,定义t=-num[i],定义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(一个小优化:当num[i]>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;
    }
};
相关推荐
2301_8227032020 小时前
Flutter 框架跨平台鸿蒙开发 - 创意声音合成器应用
算法·flutter·华为·harmonyos·鸿蒙
zhaoshuzhaoshu20 小时前
人工智能(AI)发展史:详细里程碑
人工智能·职场和发展
cmpxr_20 小时前
【C】数组名、函数名的特殊
c语言·算法
KAU的云实验台20 小时前
【算法精解】AIR期刊算法IAGWO:引入速度概念与逆多元二次权重,可应对高维/工程问题(附Matlab源码)
开发语言·算法·matlab
会编程的土豆20 小时前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法
大熊背21 小时前
如何利用Lv值实现三级降帧
算法·自动曝光·lv·isppipeline
大尚来也21 小时前
驾驭并发:.NET多线程编程的挑战与破局之道
java·前端·算法
向阳而生,一路生花21 小时前
深入浅出 JDK7 HashMap 源码分析
算法·哈希算法
君义_noip1 天前
信息学奥赛一本通 4150:【GESP2509七级】⾦币收集 | 洛谷 P14078 [GESP202509 七级] 金币收集
c++·算法·gesp·信息学奥赛·csp-s
摸个小yu1 天前
【力扣LeetCode热题h100】链表、二叉树
算法·leetcode·链表