leetcode(top 100) 三数之和 相向双指针

题目:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

题解:

第一步先对数组排序,然后依次枚举每一个数然后用查找两数之和的办法查找是否有两个数与当前枚举的数相加等于0。我认为本题的难点在于,在实现上述目标的基础上加上不可包含重复的三元组,这里相当于是一个小的数学知识,a,b,c三个数和是定值,如果这三个数中有两个数不变,那第三个值怎么变都是一样的,所以要想是非重复的三元组,在找到一组答案后再找下一组时至少要有两个数是与上次是不一样的。

cpp 复制代码
vector<vector<int>>ans;
    void f(int l,int r,vector<int>&arr,int k){ 
        while(l<r){
            if(arr[l]+arr[r]+arr[k]>0)r-=1;
            else if(arr[l]+arr[r]+arr[k]<0)l+=1;
            else {
                ans.push_back({arr[k],arr[l],arr[r]});
                //找下一组不重复的三元组
                l++;
                r--;
                while(l<r&&arr[l]==arr[l-1]){
                    l++;
                }
                while(l<r&&arr[r]==arr[r+1]){
                    r--;
                }
            }
        }

    }

    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size()-2;i++){
            //相同的数只用枚举查找一次即可
            if(i&&nums[i]==nums[i-1])continue;
            f(i+1,nums.size()-1,nums,i);
        }
        return ans;
    }

时间复杂度:O(n)

相关推荐
Peregrine94 分钟前
数据结构 - > 双链表
c语言·数据结构·算法
小江的记录本10 分钟前
【分布式】分布式核心组件——分布式限流:固定窗口、滑动窗口、漏桶、令牌桶算法,网关层/服务层限流实现
java·分布式·后端·python·算法·安全·面试
不懂的浪漫12 分钟前
一次设备映射缓存设计:用多索引 Map 把高频查询从遍历变成直接命中
java·算法·spring·缓存
apollowing17 分钟前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶(三十)
算法·启发式算法·web app
田野追逐星光20 分钟前
C++继承 -- 讲解超详细(上)
c++·算法
ZPC821029 分钟前
ROS2 共享内存 SHM > UDP 速度
人工智能·算法·计算机视觉·机器人
三毛的二哥9 小时前
BEV:典型BEV算法总结
人工智能·算法·计算机视觉·3d
南宫萧幕10 小时前
自控PID+MATLAB仿真+混动P0/P1/P2/P3/P4构型
算法·机器学习·matlab·simulink·控制·pid
测试199810 小时前
2026最新软件测试面试八股文【附文档】
自动化测试·软件测试·python·测试工具·面试·职场和发展·测试用例
故事和你9111 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论