[双指针] Leetcode 283.移动零和1089.复习零

news2024/9/21 4:40:42

[双指针] Leetcode 283.移动零和1089.复习零

移动零

283. 移动零

image-20231028163349090

1.题意分析

(1) 给你一个数组,将数组中的所有0移动到数组的末尾

(2) 保证非0元素在数组中相对位置不变

(3) 在原数组中操作

2.解题思路

由于题目要求我们移动数组内容(也就是交换两个数的位置),所以我们很容易想到双指针解法。

解法:双指针

定义两个“指针”(left 和 right),right遍历整个数组,遇到0就交换两个数的位置。

nums[right] == 0:right++;

nums[right] != 0:swap(nums[right],    nums[left]),  right++, left++

示例1:[0, 1, 0, 3, 12]

image-20231028165935637

image-20231028165946730

请先自己尝试实现代码,再来继续往下看。


3.代码实现
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int left = 0, right = 0; right < nums.size(); )
        {
            if(nums[right] != 0) swap(nums[left++], nums[right++]);
            else right++;
        }
    }
};

image-20231028171157270

4.总结

细节1:right的大小由我们自己在if-else控制,并不需要写入循环。

细节2:right的大小超过数组的size即为遍历完整个数组。

复习零

1089. 复写零

image-20231028171812177

1.题意分析

(1) 给你一个长度固定的数组,将数组中的0再次写一遍,即为在0后再加一个0

(2) 其余的数向右平移

(3) 超过数组长度,终止写入元素

(4) 在原数组上进行操作

2.解题思路

题目要求我们进行复写0,即需要知道两个数的位置,所以可以使用两个“指针”,一前一后:判断0,添加0。

解法:双指针

由于数组空间是固定的,我们首先需要知道最后一个数的位置,然后倒着进行修改数组。

nums[i] == 0:count+= 2;

nums[i] != 0:count++;

count >= nums.size-1:break;

i++;

i即为新数组的最后一个数,我们在倒着写回数组。

nums[i] == 0:nums[count] = 0, count[count-1] = 0, i--, count -= 2;

nums[i] != 0:nums[count] = nums[i], i--, count--。

示例1:

nums[] = [1, 0, 2, 3, 0, 4, 5, 0]

image-20231028194435626

注意处理这样的数组: nums[] = {8, 4, 5, 0, 0, 0, 0, 7}

请先自己尝试实现代码,再来继续往下看。


3.代码实现
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        //1.计算数组最后一个位置
        int count = -1, i = 0, n = arr.size();
        while(count < n)
        {
            if(arr[i] != 0) count++;
            else count += 2;
            if(count >= n-1) break;
            i++;
        }
        //处理特殊情况
        if(count == n)
        {
            arr[n-1] = 0;
            i--;
            count -= 2;
        }
        //2.逆向填充数组
        while(i >= 0)
        {
            if(arr[i] != 0) arr[count--] = arr[i--];
            else 
            {
                arr[count--] = 0;
                arr[count--] = 0;
                i--;
            }
        }
    }
};

image-20231028194627831

4.总结

细节1:count为什么初始化为-1:因为数组下标是从0开始的,从-1开始可以和数组下标对应上,不会越界;从0开始最后又得减掉,后续处理十分麻烦。

细节2:求最后的复写数时,循环中if(count >= n-1) break;:如果此时count已经大过数组的size-1(也就是超出数组的范围),就没有必要再让当前的下标i再加1了。

细节3:nums[] = {8, 4, 5, 0, 0, 0, 0, 7}:这样的数组,我们最后复写出来的结果为{8, 4, 5, 0, 0, 0, 0, 0}因为第三个0,会有一个0复写时越界了,我们之前的算法无法处理这种特殊情况,需要我们手动处理一下:count == nums.size时,将数组的最后一位手动赋值0,最后复写的数的下标i应该-1,而count应该-2(看不懂就画一下图)。

END, THANKS。

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

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

相关文章

【JAVA学习笔记】49 - String类,StringBuffer类,StringBuilder类(重要)

String类 一、String入门 1) String对象用于保存字符串&#xff0c;也就是一组字符序列 2)字符串常量对象是用双引号括起的字符序列。例如: "你好"、 "12.97"、 "boy"等 3)字符串的字符使用Unicode字符编码&#xff0c;一个字符&#xff08;不…

城市群(Megalopolis)/城际(inter-city)OD相关研究即Open Access数据集调研

文章目录 1 城市群/城际OD定义2 理论模型与分析方法2.1 重力模型 Gravity Model2.2 干预机会模型 Intervening Opportunities Model2.3 辐射模型 Radiation Model 3 Issues related to OD flows3.1 OD Prediction3.2 OD Forecasting3.3 OD Construction3.4 OD Estimation 4 OD …

Kubernetes - Ingress HTTP 负载搭建部署解决方案(新版本v1.21+)

在看这一篇之前&#xff0c;如果不了解 Ingress 在 K8s 当中的职责&#xff0c;建议看之前的一篇针对旧版本 Ingress 的部署搭建&#xff0c;在开头会提到它的一些简介Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客 开始表演 1、kubeasz 一键安装…

星闪技术 NearLink 一种专门用于短距离数据传输的新型无线通信技术

本心、输入输出、结果 文章目录 星闪技术 NearLink 一种专门用于短距离数据传输的新型无线通信技术前言星闪技术 NearLink 的诞生背景星闪技术 NearLink 简介星闪技术 NearLink 技术是一种蓝牙技术吗星闪技术 NearLink 优势星闪技术 NearLink 应用前景弘扬爱国精神星闪技术 Nea…

AlmaLinux正开发成为不包含RHEL代码但兼容RHEL的发行版本

导读近日消息&#xff0c;AlmaLinux 正在创建一个不包含 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;代码&#xff0c;但兼容 RHEL 的发行版本。 AlmaLinux OS 基金会主席 benny Vasquez 出席 All Things Open 开源社区大会&#xff0c;表示 AlmaLinux 发行版的目标…

jenkins自动化操作步骤(gitblit)

1、登陆地址&#xff1a; http://xxxxxxxxx.org:xxxx/ admin/xxxx 2、创建任务 选择构建一个maven项目 3、配置 最多只保留一天一个任务 选择git仓库和账号密码 选择代码对应分支 build项&#xff1a; 1&#xff09;使用父项目的pom文件&#xff1a;k56-boot/pom.xml 2&…

什么是鱼叉式网络钓鱼?

鱼叉式网络钓鱼 1. 鱼叉式网络钓鱼的概念2. 鱼叉式网络钓鱼的原理3. 鱼叉式网络钓鱼与网络钓鱼的区别4. 如何防范鱼叉式网络钓鱼 1. 鱼叉式网络钓鱼的概念 鱼叉式网络钓鱼&#xff08;Spear Phishing &#xff09;&#xff0c;又称鱼叉式网络攻击&#xff0c;是一种针对特定目…

SpringCore完整学习教程4,入门级别

本章从第4章开始 4. Logging Spring Boot使用Commons Logging进行所有内部日志记录&#xff0c;但保留底层日志实现开放。为Java Util Logging、Log4J2和Logback提供了默认配置。在每种情况下&#xff0c;记录器都预先配置为使用控制台输出和可选的文件输出。 默认情况下&…

云服务器搭建Spark集群

文章目录 1. Local 模式1.1 安装local模式1.2 命令行工具1.3 提交本地应用 2. Standlone模式2.1 集群配置2.2 修改配置文件2.3 启动集群与停止集群2.4 提交应用到集群环境2.5 提交应用的参数详细说明2.6 配置历史服务2.7 配置高可用&#xff08;HA&#xff09; 3. Yarn模式&…

“爱知道”,你知道吗?

拥抱时代浪潮&#xff0c;加速科技变革。数字经济时代&#xff0c;杭州重点贯彻市委市政府数字经济创新提质“一号发展工程”&#xff0c;加快发展数字经济&#xff0c;推动全市数字经济往高攀升、向新进军、以融提效。基于政府对数字经济新活力的赋能、优化数字社会环节、构建…

『力扣刷题本』:删除排序链表中的重复元素

一、题目 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff1a;head [1,1,2,3,3] 输出&am…

守牢底线——建行驻江门市分行纪检组举办2023年清廉合规大讲堂

为推动廉洁教育打通“最后一公里”&#xff0c;近日&#xff0c;建行驻江门市分行纪检组举办江门市分行2023年清廉合规大讲堂。 本次大讲堂邀请了检察院资深检察官专题讲授《金融从业人员易涉犯罪问题剖析及预防》&#xff0c;检察官结合一线办案经历&#xff0c;从防范化解金…

Spring FactoryBean 源码讲解

Spring FactoryBean 源码讲解 什么是Spring FactoryBean Spring FactoryBean是一个特殊的Bean&#xff0c;它实现了FactoryBean接口并重写了其getObject()方法&#xff0c;用于生产其他Bean的实例。在Spring容器启动时&#xff0c;会自动调用FactoryBean的getObject()方法来获…

设计模式:访问者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《状态模式》 下一篇《原型模式》 简介&#xff1a; 访问者模式&#xff0c;它是一种将数据操作与数据结构分离的设计模式&#xff0c;它属于行为型模式。访问者模式的基本思想是&#xff0c;针对…

Redis中的数据类型以及适用场景

1.Redis中的数据类型 Redis中的数据类型包括&#xff1a;String(字符串&#xff09;、Hash(字典)、List(列表)、Set(集合)、Sorted Set【Zset】(有序集合&#xff09;。 Redis 所有的数据结构都是一个key对应一个value&#xff0c;不同类型的数据结构之间的差异就在于value的…

电子器件 电阻参数与选型

一、参数 电阻的主要参数有&#xff1a;精度、温度系数和功率三个 1.1 精度 一般有0.1%、1%&#xff0c;5%&#xff0c;10%&#xff0c;15%、25%等&#xff0c;一般精度越高价格也越高。有些场合需要使用高精度的电阻。 其中精度所代表的字母如下&#xff1a; L0.01%P0.02…

建行广东江门分行:科技赋能,数据助力纠“四风”

为进一步深化落实中央八项规定精神&#xff0c;持续加大“四风”问题查处力度&#xff0c;建行驻江门市分行纪检组根据《广东省分行贯彻落实中央八项规定精神持之以恒纠治“四风”实施方案》&#xff08;建粤党发〔2023〕1号&#xff09;安排&#xff0c;对驻在市分行开展“四风…

基于ssm实验室管理系统

功能如图所示 摘要 实验室管理系统&#xff08;Laboratory Management System&#xff0c;简称LMS&#xff09;是一种基于SSM&#xff08;Spring、SpringMVC、MyBatis&#xff09;框架的信息化工具&#xff0c;旨在帮助实验室管理者高效、精确地管理实验室资源、人员和实验数据…

详解Java的八种基本数据类型

目录 Java八种数据类型 注意&#xff1a; 四个大类 整型&#xff08;byte、short、int、long&#xff09; 注意 浮点型&#xff08;float、double&#xff09; 神奇的代码 注意&#xff1a; 字符型&#xff08;char&#xff09; 布尔型&#xff08;boolean&#xff0…

CondaError: Downloaded bytes did not match Content-Length

问题 使用anaconda下载包文件时&#xff0c;出现了CondaError: Downloaded bytes did not match Content-Length的错误 CondaError: Downloaded bytes did not match Content-Lengthurl: https://conda.anaconda.org/pytorch/win-64/pytorch-2.1.0-py3.11_cuda11.8_cudnn8_0.…