【强化算法专题一】双指针算法

news2025/1/15 6:35:42

【强化算法专题一】双指针算法

  • 1.双指针算法--移动零
  • 2.双指针算法--复写零
  • 3.双指针算法--快乐数
  • 4.双指针算法--盛水最多的容器
  • 5.双指针算法--有效三角形的个数
  • 6.双指针算法--和为s的两个数
  • 7.双指针算法--三数之和
  • 8.双指针算法--四数之和

1.双指针算法–移动零

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

【代码:】

class Solution {
public:


//双指针:本质就是划分数组,数组分块
//cur:用来遍历数组,将数组分成两个部分,[o,cur-1]已经处理的部分[cur,n-1]待处理的部分
//已经处理的部分要求是什么呢?非0元素在前面,0元素在后面,那么我们利用dest指针来作为它们的分割线
//dest:已经处理的部分又被dest分割成两部分,[0,dest]是非0部分,而[dest+1,cur-1]就是0部分
//所以数组总体被分成三部分
    void moveZeroes(vector<int>& nums) {

     int cur=0;
     int dest=cur-1;

    while(cur<nums.size())
    {
        if(nums[cur]==0)
        {
            //当遇到0时不需要放入des区间,因为des区间里都是非0的
            cur++;
        }
        else
        {
            //当遇到非0时,就需要放入des区间,放进一个元素dest就要往后挪动一下,流出位置
            //但不能覆盖要交换
            dest++;
            swap(nums[dest],nums[cur]);
            cur++;
        }
    } 

    }
};

2.双指针算法–复写零

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

【代码:】

class Solution 
{
public:
    void duplicateZeros(vector<int>& arr)
    {
        //第一步找最后一个复写的数据
        int cur=0,dest=-1,n=arr.size();
        while(cur<n)
        {
            if(arr[cur])dest++;
            else dest+=2;
            //dest每次走完都要判断一下是否到头
            if(dest>=n-1)
            break;
            cur++;
        }
        //特殊情况处理
        if(dest==n)
        {
            arr[n-1]=0;
            dest-=2;
            cur--;
        }
        //正常往前复写
        while(cur>=0)
        {
            if(arr[cur])
            arr[dest--]=arr[cur--];
            else
            {
                arr[dest--]=0;
                arr[dest--]=0;
                cur--;
            }
        }
    }
};

3.双指针算法–快乐数

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】

class Solution 
{
public:
  
   int work(int n)
   {
       int ret=0;
       while(n)
       {
           ret+=(n%10)*(n%10);
           n=n/10;
       }
       return ret;
   }
    bool isHappy(int n) 
    {
    
    int slow=n,fast=n;
     //判断快慢指针相遇
     while(slow&&fast)
     {
         slow=work(slow);
         //慢指针每次走1次操作
         fast=work(work(fast));
         //快指针每次走2次操作
         if(fast==slow)
         {
             if(fast==1)
             return true;
             else
             return false;
         }
     }
    return false;
    }
};

4.双指针算法–盛水最多的容器

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】


class Solution {
public:
   int lower(int x,int y)
   {
       if(x<y)
       return x;
       else 
       return y;
   }
    int maxArea(vector<int>& height) 
    {
        vector<int> vt;
        int left=0,right=height.size()-1,V=0;
        while(left<right)
        {
            V=(right-left)*(lower(height[left],height[right]));
            vt.push_back(V);
            if(height[left]<height[right])
            ++left;
            else
            --right;
        }
      
     sort(vt.begin(),vt.end());
     return vt[vt.size()-1]; 
    }
};

5.双指针算法–有效三角形的个数

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

【代码:】

class Solution {
public:
    int triangleNumber(vector<int>& nums) 
    {
         sort(nums.begin(),nums.end());
         //首先优化数组,先排序
         int ret=0,ci=nums.size()-1;
         //首先固定的是最大值
         while(ci>=0)
         {
             int left=0,right=ci-1;
            //在最大值前面的区间里利用双指针算法
            while(left<right)
            {
                if(nums[left]+nums[right]>nums[ci])
                {
                    ret+=right-left;
                    right--;
                }
                else
                {
                    left++;
                }
            }
            ci--;
         }
          return ret;
    }
   
};

6.双指针算法–和为s的两个数

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        //使用双指针算法
        int left=0,right=nums.size()-1;
        while(left<right)
        {
            if(nums[left]+nums[right]>target)
            --right;
            else if(nums[left]+nums[right]<target)
            ++left;
            else
            return {nums[left],nums[right]};
            //大括号,这样写会发生隐射类型转化,调用vector的构造函数来构造
        }
        return {-1,-1};
    }
};

7.双指针算法–三数之和

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】

class Solution 
{
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
      //首先优化数组,对数组排序
      sort(nums.begin(),nums.end());
      //首先固定一个元素a,对后面的区间使用双指针算法,筛选
      //筛选的过程中要注意去重

      int ti=0;
      vector<vector<int>> vv;
      while(ti<nums.size()-1)
      {
        //这里要有一个小优化,排完序后,0后面肯定都是正数,整数固定以后后面不可能能找到负数了
        //所以直接可以跳过就不用固定了
           if(nums[ti]>0)break;
          //对后面的区间使用双指针算法
          int left=ti+1,right=nums.size()-1,target=-nums[ti];
         while(left<right)
         {
              if(nums[left]+nums[right]>target)
          {
            right--;
          }
          else if(nums[left]+nums[right]<target)
          {
              left++;
          }
          else//说明找到这个三元组了
          {
            vv.push_back({nums[ti],nums[left],nums[right]});
            //当找到一对满足条件的元素时,left和right要同时挪动,接下剩下的区间继续寻找
            //但要根据要去重,我们得注意下次如果再遇到上次的元素还是直接跳过去
            left++;
            right--;
            while(nums[left]==nums[left-1]&&left<right)left++;
            //还要注意避免越界left<right
            while(nums[right]==nums[right+1]&&left<right)right--;
          }
         }
       //最后还要注意对固定的元素进行去重,因为当固定相同的元素时,也会出现重复的
       int later=ti;
       ++ti;
       while(nums[later]==nums[ti]&&ti<nums.size()-1)
       //避免越界
        ++ti;
      }
      return vv;
    }
};

8.双指针算法–四数之和

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        vector<vector<int>> vv;
       //第一步给数组排序
       sort(nums.begin(),nums.end());
       //依次固定一个数a  找target-a
       for(int i=0;i<nums.size();)
       {
           int a=nums[i];
           //依次固定一个数b
           for(int j=i+1;j<nums.size();)
           {
             int b=nums[j];
             long long tar=(long long)target-a-b;
             //在b后面的区间里使用双指针算法找  target-a-b
             int left=j+1,right=nums.size()-1;
             while(left<right)
             {
                 if(nums[left]+nums[right]<tar)
                 left++;
                 else if(nums[left]+nums[right]>tar)
                 right--;
                 else
                 {
                     vv.push_back({a,b,nums[left],nums[right]});
                     left++;
                     right--;
                     //首先放入数组里,left和right各自走一步
                     //然后检查后面的值是否有相同的,如果是相同的那就跳过
                     while(nums[left]==nums[left-1]&&left<right)++left;
                     while(nums[right]==nums[right+1]&&left<right)--right;

                 }
                 //b也要注意后面如果有相同的也要跳过
             }
             j++;
             while(j<nums.size()&&nums[j-1]==nums[j])j++;
           }

           i++;
           while(i<nums.size()&&nums[i-1]==nums[i])i++;
       }

       return vv;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BIT-6自定义类型和动态内存管理(11000字详解)

一&#xff1a;自定义类型 1.1&#xff1a;结构体 在生活中&#xff0c;基本数据类型可以描述绝大多数的物体&#xff0c;比如说名字&#xff0c;身高&#xff0c;体重&#xff0c;但是还有一部分物体还不足够被描述&#xff0c;比如说我们该如何完整的描述一本书呢&#xff…

VSCode安装图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 教程说明 本教程旨在详细介绍VSCode的安装过程及其注意事项。 下载VSCode 请在官方网站 https://code.visualstudio.com/ 下载https://code.visualstudio.com/至本地&…

Android学习之路(18) 数据存储与访问

文件存储读写 1.Android文件的操作模式 学过Java的同学都知道&#xff0c;我们新建文件&#xff0c;然后就可以写入数据了&#xff0c;但是Android却不一样&#xff0c;因为Android是 基于Linux的&#xff0c;我们在读写文件的时候&#xff0c;还需加上文件的操作模式&#x…

设计模式之适配器模式:接口对接丝般顺滑(图代码解析面面俱到)

目录 概要概念组成类图工作原理应用场景优点 类型类适配器模式对象适配器模式两者区别示例代码 实现&#xff08;对象适配器详解&#xff09;业务背景代码 常见问题为什么有适配器模式适配器模式告诉我们什么适配器模式体现了哪些设计原则关联方式实现了逻辑继承适配器模式在Sp…

春招秋招,在线测评应用得越来越普及

这年代提到测评&#xff0c;很多人都比较熟悉&#xff0c;它有一种根据所选的问题给予合适答案方面的作用。因为不同的测评带来的影响不一样&#xff0c;所以很多人都会关注在线测评的内容有哪些。在校园招聘上面&#xff0c;在线测评也频繁出现了&#xff0c;这让很多人好奇它…

VD6283TX环境光传感器驱动开发(2)----获取光强和色温

VD6283TX环境光传感器驱动开发----1.获取光强和色温 概述视频教学样品申请源码下载参考源码设置增益基准配置设置ALS曝光时间通道使能启用ALS操作中断查询及清除获取ALS数据计算光强及色温结果演示 概述 为了更好地利用VD6283TX传感器的特点和功能&#xff0c;本章专门用于捕获…

用通俗易懂的方式讲解大模型分布式训练并行技术:张量并行

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…

最近脑机接口突破性成果这么多,它到底走到哪一步了?

美国心脏协会(AHA)首席临床科学官、哥伦比亚大学神经病学和流行病学终身教授Mitchell Elkind在接受NeuroNews采访时概述了脑机接口(BCI)技术的巨大潜力:“恢复患者活动能力的可能性可能会带来巨大的好处。”“对于那些功能受限的人来说&#xff0c;即使是微小的进步也能改变他们…

【数仓精品理论分析】能不能学大数据?

【数仓精品理论分析】能不能学大数据&#xff1f; 还能不能学大数据datapulse官网&#xff1a; 自身情况数据行业发展情况 还能不能学大数据 首先看到这个话题的时候&#xff0c;我是这样想的&#xff0c;能不能学大数据需要参考本人的自身情况【学历、年龄、决心、有没有矿或者…

高層建築設計和建造:從避難層到設備間和防風防火防水的設計理念,酒店住宅辦公樓都有什麽房間(精簡)

樓層概覽 標準層居住、辦公、商業等功能的樓層。結構和裝修與其他樓層相同&#xff0c;可供人正常居住、工作和活動避難層專門用於人員避難的樓層&#xff0c;通常會相隔數十個標準層&#xff0c;樓梯通常和標準層是錯開的(非公用)&#xff0c;具有更多的通風口。牆體和樓板具…

黑豹程序员-架构师学习路线图-百科:CSS-网页三剑客

文章目录 1、为什么需要CSS2、发展历史3、什么是CSS4、什么是SASS、SCSS 1、为什么需要CSS 作为网页三剑客的第二&#xff0c;CSS为何需要它&#xff0c;非常简单HTML只能完成页面的展现&#xff0c;但其做出来的页面奇丑无比。 随着网络的普及&#xff0c;人们的要求更高&…

Ubantu 20.04 卸载与安装 MySQL 5.7 详细教程

文章目录 卸载 MySQL安装 MySQL 5.71.获取安装包2.解压并安装依赖包3.安装 MySQL4.启动 MySQL 扩展开启 gtid 与 binlog 卸载 MySQL 执行以下命令即可一键卸载&#xff0c;包括配置文件目录等。 # 安装sudo软件 apt-get install sudo -y # 卸载所有以"mysql-"开头的…

小病变检测:Gravity Network for end-to-end small lesion detection

论文作者&#xff1a;Ciro Russo,Alessandro Bria,Claudio Marrocco 作者单位&#xff1a;University of Cassino and L.M. 论文链接&#xff1a;http://arxiv.org/abs/2309.12876v1 内容简介&#xff1a; 1&#xff09;方向&#xff1a;医学影像中小病变检测 2&#xff0…

PyQt5+Qt设计师初探

在上一篇文章中我们搭建好了PyQt5的开发环境&#xff0c;打铁到趁热我们基于搭建好的环境来简单实战一把 一&#xff1a;PyQt5包模块简介 PyQt5包括的主要模块如下。 QtCore模块——涵盖了包的核心的非GUI功能&#xff0c;此模块被用于处理程序中涉及的时间、文件、目录、数…

代谢组学最常用到的数据分析方法(五)

代谢组学是一门对某一生物或细胞所有低分子质量代谢产物&#xff08;以相对分子质量<1000的有机和无机的代谢物为研究核心区&#xff09;进行分析的新兴学科。因此从复杂的代谢组学数据中确定与所研究的现象有关的代谢物&#xff0c;筛选出候选生物标记物成为代谢物组学研究…

秋招,网申测评,认知能力测试

随着秋季的到来&#xff0c;越来越多的企业开始进行职业招聘&#xff0c;在这些招聘中&#xff0c;我们总会看到“认知能力测试”的影子。说到这个测试&#xff0c;很多人可能还不太理解&#xff0c;不知道这种测试是什么。 1、什么是认知能力测试 认知能力是指大脑加工、…

【Diffusion】DDPM - (1)预备基础知识

预备基础知识 1、概率 - 条件独立 A 和 B 是两个独立事件    ⇒    P ( A ∣ B ) = P ( A ) \; \Rightarrow \; P(A|B) = P(A) ⇒P(A∣B)=P(A), P ( B ∣ A ) = P ( B ) \quad P(B|A) = P(B) P(B∣A)=P(B) ⇒ P ( A , B ∣ C ) = P ( A ∣ C ) P ( B ∣ C ) \quad\quad…

Java编码

Java编码问题 Unicode与码点 所谓Unicode就是全世界的字符字典&#xff0c;也就是把字符给一个编号&#xff0c;这个编码就是码点。比如 2. 编码 由于这种分配的编码无论从占用空间角度&#xff0c;还是读取速度&#xff0c;以及逻辑划分角度&#xff0c;都不是完善。所以出…

Ai4science学习、教育和更多

11 学习、教育和更多 人工智能的进步为加速科学发现、推动创新和解决各个领域的复杂问题提供了巨大的希望。然而&#xff0c;要充分利用人工智能为科学研究带来的潜力&#xff0c;我们需要面对教育、人才培养和公众参与方面的新挑战。在本节中&#xff0c;我们首先收集了关于每…

Java并发-满老师

Java并发 一级目录栈与栈帧线程上下文切换三级目录 一级目录 栈与栈帧 满老师视频链接 我们都知道 JVM 中由堆、栈、方法区所组成&#xff0c;其中栈内存是给谁用的呢&#xff1f;其实就是线程&#xff0c;每个线程启动后&#xff0c;虚拟机就会为其分配一块栈内存 每个栈由…