双指针问题1

文章目录

  • 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;
    }
}

题目链接

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

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

相关文章

Centos7安装ElasticSearch

Centos7安装ElasticSearch 准备工作 下载elasticsearch https://www.elastic.co/cn/elasticsearch 将下载好的包上传到/usr/local/elasticsearch/ 路径下 安装 安装elasticsearch解压缩即可&#xff01; tar -zxvf elasticsearch-8.12.2-linux-x86_64.tar.gz进入/usr/loca…

计算机毕业设计PySpark+Hadoop地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Flink Hadoop 深度学习

基于Hadoop的地震预测的 分析与可视化研究 姓 名&#xff1a;____田伟情_________ 系 别&#xff1a;____信息技术学院___ 专 业&#xff1a;数据科学与大数据技术 学 号&#xff1a;__2011103094________ 指导教师&#xff1a;_____王双喜________ 年 月 日 …

度安讲 | 第二期「安全左移·业务护航」技术沙龙成功举办

当下&#xff0c;“安全左移”作为落地DevSecOps的重要实践之一&#xff0c;已在业界达成共识。DevSecOps作为一种集开发、安全、运维于一体的软件开发和运营模式&#xff0c;强调在敏捷交付下&#xff0c;“安全”在软件开发生命周期的全覆盖贯穿和核心位置。所谓“安全左移”…

多线程..

线程定义&#xff1a;线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中实际运作单位。简单来说&#xff0c;应用软件中相互独立&#xff0c;可以同时运作的功能。 多线程作用&#xff1a;有了多线程&#xff0c;我们就可以让程序…

03-240605-Spark笔记

03-240605 1. 行动算子-1 reduce 聚合 格式: def reduce(f: (T, T) > T): T 例子&#xff1a; val sparkConf new SparkConf().setMaster("local[*]").setAppName("Operator")val sc new SparkContext(sparkConf) ​val rdd sc.makeRDD(List(1…

MySQL第二种实现方式:现在有一个生产计划,甲乙丙3个品类共16个产品,生产时间6天,每天甲品类可以生产1张单,乙3张,丙1张,请用MySQL写出H列的效果

接上篇&#xff1a;链接: 现在有一个生产计划&#xff0c;甲乙丙3个品类共16个产品&#xff0c;生产时间6天&#xff0c;每天甲品类可以生产1张单&#xff0c;乙3张&#xff0c;丙1张&#xff0c;请用MySQL写出H列的效果 第二种写法&#xff1a; -- 使用WITH子句创建CTE WITH…

【Python报错】已解决ImportError: cannot import name ‘mapping‘ from ‘collections‘

成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 一、引言 在Python编程中&#xff0c;当我们尝试从某个模块中导入某个名称时&…

QT学习过程中遇到的问题自记

文章目录 前言问题1问题2问题3 前言 学习QT嵌入式实战开发(从串口通信到JSON通信微课视频版)的过程中遇到的几个小问题 问题1 1.将书中的示例代码导入自己的电脑&#xff0c;然后点击工程进去&#xff0c;不能运行&#xff0c;报错 no kits are enabled for this project… 我…

python pip 安装

如果您不确定pip的安装路径&#xff0c;可以通过以下命令来查询&#xff1a; pip show pip 这个命令会显示pip的详细信息&#xff0c;其中包括pip安装的路径。如果您想修改pip的默认安装路径&#xff0c;可以使用pip的"--target"参数指定目标路径&#xff0c;例如&a…

解决跨域的几种方法

解决跨域的方法主要有以下几种&#xff1a; 1.CORS&#xff08;跨域资源共享&#xff09; CORS是一种W3C规范&#xff0c;它定义了一种浏览器和服务器交互的方式来确定是否允许跨源请求。 服务器通过设置响应头Access-Control-Allow-Origin来允许或拒绝跨域请求。例如&#xf…

tsconfig.json和tsconfig.app.json文件解析(vue3+ts+vite)

tsconfig.json {"files": [],"references": [{"path": "./tsconfig.node.json"},{"path": "./tsconfig.app.json"}] }https://www.typescriptlang.org/tsconfig/#files files: 在这个例子中&#xff0c;files 数…

Java数据结构- Map和Set

目录 1. Map和Set2. Map的使用3. Set的使用 1. Map和Set Java中&#xff0c;Map和Set是两个接口&#xff0c;TreeSet、HashSet这两个类实现了Set接口&#xff0c;TreeMap、HashMap这两个类实现了Map接口。 带Tree的这两个类&#xff08;TreeSet、TreeMap&#xff09;底层的数…

uniapp封装picker选择器组件,支持关键字查询

CommonPicker.vue组件 路径在 components\CommonPicker.vue <template><view><uni-easyinput v-model"searchQuery" :placeholder"placeholder" /><picker :range"filteredOptions" :range-key"text" v-model&…

六位一线AI工程师总结Agent构建经验,天工SkyAgents的Agent构建实战。

原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 六位一线AI工程师总结Agent构建经验&#xff0c;天工SkyAgents的Agent构建实战。 &#x1f31f;我们给人类新手明确的目标和具体的计划&am…

浪潮电脑文件消失怎么恢复?原来有这五种方法

无论是工作、学习还是娱乐&#xff0c;电脑都扮演着举足轻重的角色。然而&#xff0c;在使用电脑的过程中&#xff0c;我们有时会遇到一些令人头疼的问题&#xff0c;比如文件突然消失。对于使用浪潮电脑的用户来说&#xff0c;文件消失可能是一个令人焦虑的问题。本文将为您详…

用负载绿原酸的纳米复合水凝胶调节巨噬细胞表型以加速伤口愈合

引用信息 文 章&#xff1a;Modulating macrophage phenotype for accelerated wound healing with chlorogenic acid-loaded nanocomposite hydrogel. 期 刊&#xff1a;Journal of Controlled Release&#xff08;影响因子&#xff1a;10.8&#xff09; 发表时间&a…

ubuntu系统(香蕉派)设置开机自启动

基本使用参考我之前发的&#xff1a;OrangePi AIpro从上手到网站部署使用-CSDN博客 以下介绍两种设置开机自启动的方法&#xff0c;分别对应界面中配置和在命令中配置 方法1&#xff1a; 编辑开启自启动命令 sudo nano /etc/rc.local # 在该文件中添加启动执行命令&#xff…

外企跨国大数据迁移的注意事项

跨国数据迁移&#xff0c;对汽车行业来说&#xff0c;是一桩大事。跨国公司在进行这一操作时&#xff0c;会遇到不少挑战&#xff0c;比如网络延迟、数据安全、成本控制等等。今天&#xff0c;咱们就聊聊跨国大数据迁移中&#xff0c;跨国车企需要留意的几个关键点。 跨国大数据…

主流的单片机语言是 C 吗?是的话为啥不是 C++?

是c&#xff0c;而且可以预见在很长很长一段时间&#xff0c;没有巨大变革的情况下都会是c 商业项目开发光讨论语言特性优劣问题&#xff0c;是非常片面的&#xff0c;所以要看待为什么是c&#xff0c;最主要仍然是从收益和成本上来看。 刚好我有一些资料&#xff0c;是我根据…

通过 SFP 接口实现千兆光纤以太网通信4

Tri Mode Ethernet MAC 与 1G/2.5G Ethernet PCS/PMA or SGMII 的连接 在设计中&#xff0c;需要将 Tri Mode Ethernet MAC 与 1G/2.5G Ethernet PCS/PMA or SGMII 之间通过 GMII 接口互联。Tri Mode Ethernet MAC IP 核的工作时钟源为 1G/2.5G Ethernet PCS/PMA or SGMII …