Hot100 - 三数之和

原题链接

本文讲解题目一种解法,遍历加双指针法。时间复杂度O(n2),空间复杂度O(log n)(不计算输入输出空间)

思路

看到这个题目容易让人想到两数之和,会想要使用类似的方法,确实如此。而且根据输入范围可知,时间复杂度至高可以达到 n2logn ,可以使用比较暴力的方法。

那么可以发现,如果固定一个数之后,就可以转换为两数之和了,又因为要求找到所有答案,所以使用双指针暴力查找就可以。

那么整体就应该是外层遍历第一个数,双指针查找后两个数,时间复杂度就是 n2。

实现

确定整体实现后,接下来就是考虑怎么具体实现了。

首先需要排序,然后每次遍历一个数,双指针范围就是这个数的右侧。

接下来是关键的去重,首先看为什么会有重复:存在相同的数,所有只需要跳过所有重复的数就可以。

那么具体就分两种,1 外层循环遍历时如果与前一个数字相同就跳过,2 内层循环当出现结果时,如果和下一个数相同就继续移动指针。

需要注意的比较中需要防止越界。

代码

cpp 复制代码
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>>ans;
        int n=nums.size();

        for(int i=0;i<n-2;i++){
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            int l=i+1;
            int r=n-1;
            
            while(l<r){
                int sum=nums[l]+nums[r]+nums[i];
                if(sum==0){
                    ans.push_back({nums[i],nums[l],nums[r]});
                    while(l<r&&nums[l]==nums[l+1])l++;
                    while(l<r&&nums[r]==nums[r-1])r--;
                    l++;
                    r--;
                    
                }else if(sum>0){
                    r--;
                }else{
                    l++;
                }
                
            }
        }return ans;
    }
};

总结

这题就是一个双指针题目,但是需要注意去重,整体不难想。最开始我用的时单独变量存储,判断去重结果复杂而且漏查。

只要发现重复来源为重复数字,直接跳过就可以,然后就可以做出来了。

相关推荐
longlongzihan1 小时前
C++ 常用数据结构速查:vector、stack、queue、list、树、图、哈希表等声明与核心操作
数据结构·c++·list
思茂信息1 小时前
CST技术案例:加载正弦曲线的平面螺旋天线仿真研究
算法·平面·emc·cst·电磁仿真·仿真辐射
嫂子开门我是_我哥1 小时前
敏感性分析
算法·机器学习·论文笔记
别动我齐刘海2 小时前
实时控制学习2
linux·c++·人工智能·学习·算法
有Li2 小时前
EEG脑电图数据处理基础
人工智能·算法·机器学习·语言模型·医学生
XMXFS2 小时前
小红书推荐算法底层逻辑解析:用数据思维做内容优化
python·算法·新媒体运营·推荐算法
0+1112 小时前
算法 --栈
算法·leetcode
鶴哥只手遮天2 小时前
Gmsh 源码深度解析-第 2 章 几何内核
算法·开源
鶴哥只手遮天2 小时前
Gmsh 源码深度解析-第 9 章 后处理与插件体系
算法·开源