当前位置: 首页 > article >正文

优先算法 —— 双指针系列 - 三数之和

1. 三数之和

题目链接:

  

15. 三数之和 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/3sum/description/

 

 


2. 题目解析

由题可以得出:三个数不能选择重复位置的下标,同时还要满足三数相加之和为0,并且不能返回重复的三元组合

  

结合示例1来理解:

  

  

我们可以这样选择:

  

  

注意:

  


3. 算法原理

解法1:暴力枚举

  

排序 + 暴力枚举 + 使用set进行去重  

我们可以先进行排序,这样我们枚举之后就会发现如果有相同的那么枚举出来的值是一样的

   

然后再使用set的特性进行去重

  

解法2:双指针算法

 排序 + 双指针

 

我们在暴力枚举的基础上进行优化,我们进行了排序,那么数组就变成了有序的,如果是有序的数组,那么我们一般使用 二分 或者 双指针 来解决,一般能够使用双指针来解决问题就不要使用二分

  

     

  

当a>0的时候就不需要考虑了  

  

当我们进行去重操作的时候,当数组是下面这种情况的话,我们的指针是有可能越界的

  

  

  

 


4. 代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ret;//记录最终结果

        //排序
        sort(nums.begin(),nums.end());

        //固定完一个数之后使用双指针
        int n=nums.size();
        for(int i=0;i<n;)//固定数a
        {
            if(nums[i]>0) break;

            //target=-nums[i]目标值的相反数
            int left=i+1,right=n-1,target=-nums[i];
            while(left<right)
            {
                int sum=nums[left]+nums[right];
                if(sum>target) right--;
                else if(sum<target) left++;
                else{
                    ret.push_back({nums[i],nums[left],nums[right]});
                    left++;
                    right--;

                    //进行l和r的去重操作
                    while(left<right && nums[left] == nums[left-1]) left++;
                    while(left<right && nums[right] == nums[right+1]) right--;
                }
            }
            //进行i的去重
            i++;//将for循环的i++放到这里
            while(i<n && nums[i] == nums[i-1]) i++;
        }
        return ret;
    }
};


未完待续~


http://www.kler.cn/a/420322.html

相关文章:

  • 红日靶场vulnstark 2靶机的测试报告
  • 【力扣】3274. 检查棋盘方格颜色是否相同
  • 在Mac上安装多个Java版本
  • python之Flask入门—路由参数
  • 【前端】理解 JavaScript 中 typeof 操作符的独特行为
  • Qt桌面应用开发 第十天(综合项目二 翻金币)
  • 机器学习:机器学习项目的完整周期
  • VS Code配置Lua调试环境
  • 【Verilog】实验三 数码管实验
  • 使用 Pytorch 构建 Vanilla GAN
  • Jenkins环境搭建及简单介绍
  • 十、软件设计架构-微服务-服务调用Dubbo
  • Ubuntu24.04初始化教程(包含基础优化、ros2)
  • 高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)
  • Ajax:回忆与节点
  • 使用R语言优雅的获取任意区域的POI,道路,河流等数据
  • StarRocks存算分离在得物的降本增效实践
  • 基于Pyside6开发一个通用的在线升级工具
  • Liunx系统编程——shell的简单实现
  • HO-VMD-TCN西储大学轴承故障诊断
  • 分治的思想(力扣965、力扣144、牛客KY11)
  • SQL进阶技巧:非等值连接--单向近距离匹配
  • python 的while break continue 嵌套循环
  • 人工智能-卷积神经网络(学习向)
  • 如何搭建JMeter分布式集群环境来进行性能测试
  • 【N 卡 掉驱动 Driver 】NVML ERROR: Driver Not Loaded