算法练习之双指针算法

目录

前言

一、移动零【做题链接】

二、复写零【做题链接】

三、快乐数【做题链接】

四、盛水最多的容器【做题链接】

五、查找总价值为目标值的两件商品【做题链接】

六、三数之和【做题链接】

七、四数之和 【做题链接】

八、有效三角形的个数【做题链接】

总结


前言

欢迎感兴趣的小伙伴交流学习。


一、移动零【做题链接】

图1.1        题目描述
图1.2        题目解释

 题目代码:

class Solution {
public:
    void moveZeroes(vector<int>& nums) 
    {
        int green_pointer = 0;
        int blue_pointer = -1;

        for (; green_pointer < nums.size(); green_pointer++)
        {
            if (nums[green_pointer] != 0)
            {
                blue_pointer++;
                
                int tmp;
                tmp = nums[green_pointer];
                nums[green_pointer] = nums[blue_pointer];
                nums[blue_pointer] = tmp;
            }
        }
    }
};

二、复写零【做题链接】

图2.1        题目描述
图2.2        题目解析

题目代码:

class Solution {
public:
    void duplicateZeros(vector<int>& arr)
    {
        int write = arr.size() - 1;
        int count_write_zore = 0;
        int read;
        int i = 0;
        for (; count_write_zore < arr.size(); i++)
        {
            count_write_zore++;
            if (arr[i] == 0)
            {
                count_write_zore++;
            }
        }
        read = i - 1;
      
        for (; read >= 0; read--)
        {
            arr[write--] = arr[read];
            if (arr[read] == 0 && (read != i - 1 || count_write_zore == arr.size()))
            {
                arr[write--] = arr[read];
            }
        }
    }
};

三、快乐数【做题链接】

图3.1        题目描述

题目代码: 

class Solution {
public:
    int count(int n)
    {
        int ret=0;
        while(n%10!=0||n/10)
        {
            ret+=pow(n%10,2);
            n/=10;
        }
        cout<<ret<<" ";
        return ret;
    }

    bool isHappy(int n) 
    {
        int fast_pointer=count(count(n));
        int slow_pointer=n;

        while(fast_pointer!=slow_pointer)
        {   

            fast_pointer=count(count(fast_pointer));
            cout<<"(";
            slow_pointer=count(slow_pointer);
            cout<<")";
        }
       
        if(fast_pointer==1)
        {
            return true;
        }
        return false;
    }
};

四、盛水最多的容器【做题链接】

图4.1        题目描述
class Solution {
public:
    int maxArea(vector<int>& height) 
    {
        int left=0;
        int right=height.size()-1;
        int ret=0;

        while(left<right)
        {
           ret=max(ret,(right-left)*min(height[right],height[left]));
           if(height[left]<height[right])
           {
            left++;
           }
           else if(height[left]>=height[right])
           {
            right--;
           }
           cout<< ret<<" "<<left<<" ";
        }
        return ret;
    }
};

五、查找总价值为目标值的两件商品【做题链接】

图5.1        题目描述
class Solution 
{
public:
    vector<int> twoSum(vector<int>& price, int target) 
    {
        int left=0;
        int right=0;
        vector<int> ret;
        for(int i=0;i<price.size();i++)
        {
            left=i;
            right=price.size()-1;
            int need=target-price[i];
            while(left<right)
            {
                if(need>price[right])
                {
                    break;
                }
                else if(need<price[left])
                {
                    break;
                }
                else
                {
                    if(need==price[left]||need==price[right])
                    {
                        ret.push_back(price[i]);
                        if(need==price[left])
                        {
                            ret.push_back(price[left]);
                        }
                        else
                        {
                            ret.push_back(price[right]);
                        }
                        return ret;
                    }
                    left++;
                    right--;
                }
            }
        }
        return ret;
    }
};

 

六、三数之和【做题链接】

图6.1        题目描述
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums)
    {
        vector<vector<int>> ret;
        sort(nums.begin(), nums.end());    
        for (int i = 0; i < nums.size(); i++)
        {
            int left = i + 1;
            int right = nums.size() - 1;
            int target = -nums[i];
            if (i!=0&&nums[i] == nums[i - 1])
            {
                continue;
            }
            while (left < right)
            {
                
                if (target == nums[left]+ nums[right])
                {
                    if ((left!=i+1)&&nums[left]==nums[left-1]||(right!=nums.size()-1)&&nums[right]==nums[right+1])
                    {
                        if (nums[left] == nums[left - 1])
                        {
                            left++;
                        }
                        if (nums[right] == nums[right + 1])
                        {
                            right--;
                        }
                        continue;
                    }
                    ret.push_back({ nums[i],nums[left],nums[right]});
                    left++;
                    right--;
                }
                else if (target > nums[left] + nums[right])
                {
                    left++;
                }
                else if (target < nums[left]+ nums[right])
                {
                    right--;
                }
            }
        }
        return ret;
    }
};

七、四数之和 【做题链接】

图7.1        题目描述
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        vector<vector<int>> ret;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++)
        {
            long long tmp1=target-nums[i];
            if(i!=0&&nums[i]==nums[i-1])
            {
                continue;
            }
            for(int j=i+1;j<nums.size();j++)
            {
                long long tmp2=tmp1-nums[j];
                if(j!=i+1&&nums[j]==nums[j-1])
                {
                    continue;
                }

                int left=j+1;
                int right=nums.size()-1;
                while(left<right)
                {
                    if(tmp2==nums[left]+nums[right])
                    {
                        if((left!=j+1&&nums[left]==nums[left-1])||(right!=nums.size()-1&&nums[right]==nums[right+1]))
                        {
                            if(nums[left]==nums[left-1])left++;
                            if(nums[right]==nums[right+1])right--;
                            continue;
                        }
                        ret.push_back({nums[i],nums[j],nums[left],nums[right]});
                        left++;
                        right--;
                    }
                    else if(tmp2>nums[left]+nums[right])
                    {
                        left++;
                    }
                    else if(tmp2<nums[left]+nums[right])
                    {
                        right--;
                    }
                }
            }
        }
        return ret;
    }
};

八、有效三角形的个数【做题链接】

图8.1        题目描述

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        if (nums.size() < 3) return 0;
        sort(nums.begin(), nums.end());
        int ret = 0;
        int n = nums.size();
        for (int i = n - 1; i >= 2; --i){//固定住最长的那条边
            int l = 0, r = i - 1;//l,r分别代表两条边
            while (l < r){
                if (nums[l] + nums[r] > nums[i]){
                    ret += r - l;
                    --r;
                }else{
                    ++l;
                }
            }
        }

        return ret;
    }
};

总结

本文介绍了一些有关双指针的算法,一些没有描述的在最近就会补上,另外,文中图片不清晰的可以去博主码云查看【点我】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MapReduce | 二次排序

1.需求 主播数据--按照观众人数降序排序&#xff0c;如果观众人数相同&#xff0c;按照直播时长降序 # 案例数据 用户id 观众人数 直播时长 团团 300 1000 小黑 200 2000 哦吼 400 7000 卢本伟 100 6000 八戒 250 5000 悟空 100 4000 唐僧 100 3000 # 期望结果 哦吼 4…

STC8增强型单片机开发【电位器案例(ADC)⭐⭐】

目录 一、引言 二、硬件准备 三、电路连接 四、软件编程 五、案例实现 六、总结 一、引言 STC8系列增强型单片机以其高性能、低功耗和丰富的外设接口&#xff0c;在嵌入式系统开发中得到了广泛应用。其中&#xff0c;模数转换器&#xff08;ADC&#xff09;是单片机的一…

鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式

运行机制 共享好端端的一词&#xff0c;近些年被玩坏了&#xff0c;共享单车,共享充电宝,共享办公室&#xff0c;共享雨伞… 甚至还有共享女朋友&#xff0c;真是人有多大胆&#xff0c;共享有多大产。但凡事太尽就容易恶心到人&#xff0c;自己也一度被 共享内存 恶心到了&am…

代码生成工具1 ——项目简介和基础开发

1 项目简介 需要提前在数据库建好表&#xff0c;然后执行代码生成工具&#xff0c;会生成简单的Java文件&#xff0c;避免重复编写增删改查代码。类似的工具网上有很多&#xff0c;本人开发这个工具属于自娱自乐。这个专栏会记录开发的过程。 2 项目搭建 数据库使用MySQL &…

MySQL中的子查询

子查询,在一个查询语句中又出现了查询语句 子查询可以出现在from和where后面 from 表子查询(结果一般为多行多列)把查询结果继续当一张表对待 where 标量子查询(结果集只有一行一列)查询身高最高的学生,查询到一个最高身高 列子查询(结果集只有一行多列) 对上表进行如下操作 …

韩顺平0基础学Java——第10天

p202-233 类与对象&#xff08;第七章&#xff09; 成员方法 person类中的speak方法&#xff1a; 1.public表示方法是公开的 2.void表示方法没有返回值 3.speak&#xff08;&#xff09;中&#xff0c;speak表示方法名&#xff0c;括号是形参列表。 4.大括号为方法体&am…

SpringCloud2024最新版链路追踪教程micrometer+zipkin

本文基于B站尚硅谷2024版springcloud教学视频&#xff0c;主要用于自己学习记录以及分享技术&#xff0c;侵权私删 自己本机环境信息&#xff1a; jdk&#xff1a;17.0.10springboot&#xff1a;3.2.0springcloud&#xff1a;2023.0.0 micrometer 之前行业内使用的分布式链路…

机器学习案例:加州房产价格(一)

参考链接&#xff1a;https://hands1ml.apachecn.org/2/ 假设你是被一家地产公司雇佣的数据科学家&#xff0c;现在需要做一些工作。 公司所给的数据集是StatLib 的加州房产价格数据集。这个数据集是基于 1990 年加州普查的数据。数据已经有点老&#xff0c;但它有许多优点&…

HCIP的学习(15)

第六章&#xff0c;BGP—边界网关协议 自治系统—AS ​ 定义&#xff1a;由一个单一的机构或组织所管理的一系列IP网络及其设备所构成的集合。 ​ AS的来源&#xff1a; 整个网络规模过大&#xff0c;会导致路由信息收敛速度过慢&#xff0c;设备对相同目标认知不同。AS之间…

HCIP 6(BGP综合实验)

一、实验拓扑 二、实验要求 1.AS1中存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能在任何协议中宣告&#xff1b;AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24&#xff0c;该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以…

批量文本高效编辑神器:轻松拆分每行内容,一键保存更高效!轻松实现批量拆分与保存

文本处理成为我们日常工作中的一项重要任务。然而&#xff0c;面对大量的文本内容&#xff0c;传统的逐行编辑方式往往显得繁琐且效率低下。那么&#xff0c;有没有一种更高效、更便捷的解决方案呢&#xff1f;答案是肯定的——批量文本高效编辑神器&#xff0c;让您的文本处理…

用命令运行Java程序

1、创建一个类 2、在类文件路径下执行命令(编译)&#xff0c;生成.class javac 类名.java 3、运行.class文件 java 类名

机器学习案例:加州房产价格(二)

参考链接&#xff1a;https://hands1ml.apachecn.org/2/ 设计好系统后&#xff0c;要开始在工作区编写代码来解决问题了。 下载数据 首先我们需要先得到数据集。 一般情况下&#xff0c;数据是存储于关系型数据库&#xff08;或其它常见数据库&#xff09;中的多个表、文档、…

WSL——Centos7.9安装

1. 下载cenos镜像包 centos7.9下载地址 下载CentOS7.zip 2. 安装 将下载的zip文件解压至安装目录(这个目录就是安装centos的目录&#xff0c;可以是c盘之外的盘) 双击CentOS.exe 安装完成后&#xff0c;在安装目录下会多出一个ext4.vhdx 3. 启动 使用 wsl --list 可以查…

linux学习:linux视频输出+FRAME BUFFER+jpeg库+lcd上显示

目录 概念 使用 struct fb_fix_screeninfo{ } struct fb_bitfield { } struct fb_var_screeninfo{ } 例子1 例子2 例子3 jpeg库 步骤 概念 framebuffer 是一种很底层的机制&#xff0c;在 Linux 系统中&#xff0c;为了能够屏蔽 各种不同的显示设备的具体细节&#…

使用 scrapyd 部署 scrapy

1.scrapyd 是什么&#xff1f; Scrapyd 是一个用于部署和运行 Scrapy 爬虫项目的服务器应用程序。它使得你可以通过 HTTP 命令来部署、管理和执行多个 Scrapy 爬虫&#xff0c;非常适合持续集成和生产环境中的爬虫部署。 2.安装scrapyd 并使用 2.1 安装 scrapyd F:\scrapydTes…

CSS之高级技巧

目录 CSS高级技巧精灵图&#xff08;精灵技术&#xff09;字体图标iconfontCSS三角CSS用户界面样式vertical-align属性应用溢出的文字省略号显示常见布局技巧 CSS高级技巧 精灵图&#xff08;精灵技术&#xff09; 为什么&#xff1f; 目的&#xff1a;有效减少服务器接受和…

vs code中如何使用git

由于本地代码有了一些储备&#xff0c;所以想通过网址托管形式&#xff0c;之前一直使用了github&#xff0c;但是鉴于一直被墙&#xff0c;无法登录账号&#xff0c;所以选择了国内的gitee来作为托管网站。 gitee的网址&#xff1a;Gitee - 基于 Git 的代码托管和研发协作平台…

【论文阅读笔记】MapReduce: Simplified Data Processing on Large Clusters

文章目录 1 概念2 编程模型3 实现3.1 MapReduce执行流程3.2 master数据结构3.3 容错机制3.3.1 worker故障3.3.2 master故障3.3.3 出现故障时的语义 3.4 存储位置3.5 任务粒度3.6 备用任务 4 扩展技巧4.1 分区函数4.2 顺序保证4.3 Combiner函数4.4 输入和输出的类型4.5 副作用4.…

如何自定义Linux命令

说明&#xff1a;本文介绍如何将自己常用的命令设置为自定义的命令&#xff0c;以下操作在阿里云服务器CentOS上进行。 修改配置文件 修改配置文件前&#xff0c;先敲下面的命令查看当前系统配置的shell版本 echo $SHELL或者 echo $0区别在于&#xff0c;$SHELL查看的是系统…