双指针问题1

news2024/11/27 11:40:39

文章目录

  • 1. 移动零(283)
  • 2. 复写零(1089)
  • 3. 快乐数(202)
  • 4. 盛最多水的容器(11)


1. 移动零(283)

题目描述:
在这里插入图片描述

算法原理:
设置两个指针分别为cur以及dest,cur指针和dest指针将nums数组分为三个部分,[0,dest]为处理后的不为0的部分,[dest+1,cur-1]为处理后的为0的部分,[cur,nums.length-1]为未处理的部分。cur就是用来指向即将处理的元素,dest就是用来指向处理后的位置,具体来说就是使用cur来遍历nums数组,如果元素等于0那么直接cur+1,如果元素不等于0那么就将该位置元素与dest+1位置的元素交换,这样就能保证将nums数组划分出以上的三部分(dest指针走的要比cur指针要慢一点)。
代码如下:

class Solution {
    public void moveZeroes(int[] nums) {
        int left = -1, right = 0;
        for (; right < nums.length; right++) {
            if (nums[right] != 0) {
                left++;
                int temp = nums[right];
                nums[right] = nums[left];
                nums[left] = temp;
            }
        }
    }
}

题目链接

2. 复写零(1089)

题目描述:
在这里插入图片描述

算法原理:
这题不能使用上题相同的思想,cur和dest不能从左边开始,如果从左边每次复写0的时候,dest一次要加2,所以dest位置是有可能会超过cur的,这就会导致cur读到错误的值。
这题我们的cur和dest从数组的右边开始操作,但是此时起始处理的数字不是数组末尾的元素,而是数组复写零后的最后一个数字,所以我们要在操作之前找到这个复写零后的最后一个数字,这个找的过程也是通过双指针来实现,left遍历数组,如果元素为0则right+2,如果不为0则right+1,当此时right走到数组尾部时,left指向的元素就是数组复写零后尾部的数字。之后按照第一题类似的过程即可得到复写数组,但是此时有一种特殊情况会导致数组越界问题,就是当前面的right等于arr.length时,说明复写时left最后一个数字为0。因此我们在真正使用cur和dest进行复写之前先判断right是否为arr.length,如果是那么将left-1以及将arr[arr.length]赋为0并且将right-2,经过这样的操作之后再进行复写(其实这种情况就是left遍历的最后一个数字是0,但是此时right位置为arr.length-2了,已经无法复写两个0,但是right还是加了2),具体看代码。
代码如下:

 class Solution {
    public void duplicateZeros(int[] arr) {
        int left = 0, right = -1;
        for (; left < arr.length; left++) {
            if (arr[left] == 0) {
                right += 2;
            } else {
                right++;
            }
            if (right >= arr.length - 1) {
                break;
            }
        }

        if (right == arr.length) {
            arr[arr.length - 1] = 0;
            right = arr.length - 2;
            left--;
        }
        int cur = left, dest = right;
        for (; cur >= 0; cur--) {
            if (arr[cur] == 0) {
                arr[dest] = 0;
                arr[dest - 1] = 0;
                dest -= 2;
            } else {
                arr[dest] = arr[cur];
                dest--;
            }
        }
    }
}

题目链接

3. 快乐数(202)

题目描述:
在这里插入图片描述

算法原理:
通过理解上述的题目描述我们可以理解到一个n对于这种不断的各位的平方和有三种可能,第一种可能就是出现平方和为1的情况然后一直循环下去,第二种情况也是发生循环但是循环的节点不是平方和为1的情况,而是平方和为其它值的情况,第三种情况就是不发生循环。事实上是没有第三种情况的,假设n这个数字最多就是10位的数字,那么它最大就是9999999999构成,这样的话它的后面的平方和取值范围为1到810,在无限循环中很容易遍历完这样小的范围,一旦第二次遍历到范围内的数就会出现循环,所以肯定会发生循环。根据以上分析,我们设置快慢指针,快指针一次计算两次平方和,慢指针一次计算一次平方和,并且慢指针初始值为n,快指针初始值为n计算一次的平方和,通过不断循环这个过程,快指针肯定是能追上慢指针的,此时跳出循环,返回相同的值,如果值为1那么就返回true反之则返回false.
代码如下:

class Solution {
    public int bitSum(int n) {
        int sum = 0;
        while (n != 0) {
            int t = n % 10;
            sum += t * t;
            n = n / 10;
        }

        return sum;

    }

    public boolean isHappy(int n) {
        int slow = n, fast = bitSum(n);
        while (slow != fast) {
            slow = bitSum(slow);
            fast = bitSum(bitSum(fast));
        }

        return slow == 1 ? true : false;
    }
}

题目链接

4. 盛最多水的容器(11)

题目描述:
在这里插入图片描述
在这里插入图片描述
算法原理:
在做这题之前我们先分析一个小区间[6,1,5,2],首先对首尾的6和2进行分析,此时2除了6还可以搭配1和5,但是我们思考一下不难发现2和5搭配的话长度先减少然后高度不变,整体面积肯定减小;2和1搭配不仅长度减小,连高度也减小,此时面积肯定也是减小的。我们先分析的是尾部的元素,其实首部也是一样的,我们将数组首尾调换即[2,1,5,6],不难发现首部的2除了与6搭配,向内搭配面积都会减小。
其实这样举例就是为了说明一个规律,当一对元素配对时对于height数组值较小的那个元素它向数组内匹配的面积大小肯定是没有原来的搭配大的,因此我们在每次配对时使用左右指针分别指向两边的元素,记录此时面积,然后比较两个height数组值,将指向小height值的指针向内聚拢一个单位。这样达到的效果就是相当于去掉了那个元素,因为那个元素的搭配的最大面积我们已经得到了就是最初记录的面积,将那个元素和其它元素搭配肯定不如原搭配的面积的(前面分析了规律)。通过不断重复这样的过程也就是记录面积后去掉height值小的元素即指针向内靠拢一个单位,最终左右指针相遇循环结束,当然在这个过程中记录的面积要进行比较,从而得到最终的最大面积。
代码如下:

class Solution {
    public int maxArea(int[] height) {
        int left = 0, right = height.length - 1, area = 0;
        while (left < right) {
            int temp = Math.min(height[left], height[right]) * (right - left);
            area = Math.max(temp, area);
            if (height[left] >= height[right]) {
                right--;
            } else if (height[left] < height[right]) {
                left++;
            }

        }
        return area;
    }
}

题目链接

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

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

相关文章

​​​​【动手学深度学习】残差网络(ResNet)的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 残差网络 &#x1f30d;3.2 练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 了解残差网络&#xff08;ResNet&#xff09;的原理和架构&#xff1b;探究残…

javaweb的新能源充电系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;充电桩管理&#xff0c;报修管理&#xff0c;新能源公告管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;充电桩&#xff0c;新…

快速了解JVM机制

1.JVM 简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。 常⻅的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; V…

基于SpringBoot+Vue电影院选票系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

查询SQL02:寻找用户推荐人

问题描述 找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 以 任意顺序 返回结果表。 结果格式如下所示。 题目分析&#xff1a; 这题主要是要看这null值会不会用&#xff0c;如果说Java玩多了&#xff0c;你去写SQL时就会有问题。在SQL中判断是不是null值用的是is null或…

(CVPRW,2024)可学习的提示:遥感领域小样本语义分割

文章目录 相关资料摘要引言方法训练基础类别新类别推理 相关资料 论文&#xff1a;Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 代码&#xff1a;https://github.com/SteveImmanuel/OEM-Few-Shot-Learnable-Prompt 摘要 小样本分割是一项…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:公路智能巡检解决方案

项目背景 中国公路网络庞大&#xff0c;总里程超过535万公里&#xff0c;高速公路里程位居世界前列。面对基础设施存量的不断增长&#xff0c;公路养护管理已迈入“建管养并重”的新时代。随着养护支出的逐年攀升&#xff0c;如何提升养护效率、降低管理成本&#xff0c;成为亟…

JWT及单点登录实现

JWT发展简史 JWT Token JSON Web Token (JWT&#xff0c;RFC 7519 (opens new window))&#xff0c;是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准&#xff08;(RFC 7519)。 ID Token OIDC (OpenID Connect) 协议 (opens new window)对 OAuth 2.0 协议 …

Nginx编译安装+nginx模块

一、I/O模型 处理高并发的时候用 1.1I/O模型简介 同步/异步&#xff08;消息反馈机制&#xff09;&#xff1a;关注的是消息通信机制&#xff0c;即调用者在等待一件事情的处理结果时&#xff0c;被调用者是否提供完成状态的通知。 同步&#xff1a;synchronous&#xff0c;…

【kubernetes】探索k8s集群的配置资源(secret和configma)

目录 一、Secret 1.1Secret 有四种类型 1.2Pod 有 3 种方式来使用 secret 1.3应用场景&#xff1a;凭据 1.4创建 Secret 1.4.1用kubectl create secret命令创建Secret 1.4.2内容用 base64 编码&#xff0c;创建Secret 1.4.2.1Base64编码 1.4.2.2创建YAML文件 1.4.2.3…

中国游戏产业月度报告分享 | 洞察游戏行业市场

作为中国音像与数字出版协会主管的中国游戏产业研究院的战略合作伙伴&#xff0c;伽马数据发布了《2024年4月中国游戏产业月度报告》。 数据显示&#xff0c; 2024年4月&#xff0c;中国游戏市场实际销售收入224.32亿元&#xff0c;环比下降4.21%&#xff0c;同比下降0.27%。移…

上位机图像处理和嵌入式模块部署(f407 mcu中的项目开发特点)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和soc相比较&#xff0c;mcu的项目规模一般不算大。因为&#xff0c;soc项目中&#xff0c;从规划、硬件开发、驱动、应用端、服务器端到测试&…

漏洞挖掘 | 记一次项目上从前台登录到Getshell

这一次要打的目标是一个管理系统&#xff0c;开局一个登录框&#xff0c;按照常规思路是先测测弱口令然后爆破&#xff0c;不行再试试SQL注入&#xff0c;这一次运气较好&#xff0c;admin1,admin直接进去了 进入后台&#xff0c;功能还是很多的 有个上传&#xff0c;不过没啥用…

Vue3主题切换

又是一个曾经研究失败的课题&#xff0c;嘻嘻&#xff0c;今天必拿下~ 网上有很多主题切换的案例&#xff0c;但是别人的终究是别人的&#xff0c;研究透彻你才能灵活运用。这边用的V3 admin vite项目的主题切换。 这边cv了相关组件后报错 在这个函数时发生了错误&#xff0c;…

gitee上传整个项目文件夹

1.访问git官网并下载 Git 如下图&#xff1a; 点击download&#xff0c;然后选择合适的版本进行下载&#xff1a; 如下图&#xff0c;我下载的是2.32.0.2版本&#xff0c;64位windows版。 下载完之后&#xff0c;直接点击安装。 然后根据向导&#xff0c;一路默认到安装完成。…

超越预期:Containerd 如何成为 Kubernetes 的首选容器运行时

> 作者&#xff1a;尹珉&#xff0c;KubeSphere Ambassado&#xff0c;rKubeSphere Contributor&#xff0c;KubeSphere 社区用户委员会杭州站站长。 踏上 Containerd 技术之旅 容器技术已经成为现代软件开发和部署的核心工具。通过容器&#xff0c;开发者可以创建轻量级…

Unity【入门】重要组件和API

Unity重要组件和API 文章目录 1、最小单位GameObject1、成员变量2、静态方法1、代码创建Unity自带几何体 CreatePrimitive2、查找对象3、实例化对象&#xff08;克隆对象&#xff09;的方法4、删除对象的方法5、切换场景不移除 3、成员方法1、创建空物体2、为对象动态添加脚本(…

ESXi内安装OpenWrt

目录 0、前言 1、环境 2、转换格式 3、创建虚拟机 4、OpenWrt设置 5、单臂流量测试 6、总结 0、前言 前几天在ESXi中先安装了PVE,然后在PVE中安装OpenWrt,没有来得及深入测试,仅仅作为安装和熟悉PVE的过程。后来转念一想为什么不在ES…

OpenStack云平台管理

OpenStack云平台管理 文章目录 OpenStack云平台管理资源列表基础环境一、部署Openstack二、创建网络和路由2.1、删除默认的网络2.2、创建网络和路由2.2.1、创建外部网络2.2.2、创建内部网络 2.3、创建路由 三、创建实例3.1、配置实例3.2、配置NAT转换 四、绑定浮动IP地址五、添…

Nacos的下载使用

下载 本地Java8Maven环境 下载地址 https://github.com/alibaba/nacos/releases使用 解压安装包&#xff0c;直接运行bin目录下的startup.cmd 账号密码都是nacos