【数据结构和算法】移动零

news2024/11/24 19:12:40

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 方法一:双指针

2.2 方法二:两次遍历

2.3 方法三:一次遍历

三、代码

3.1 方法一:双指针

3.2 方法二:两次遍历

3.3 方法三:一次遍历

四、复杂度分析

4.1 方法一:双指针

4.2 方法二:两次遍历

4.3 方法三:一次遍历


前言

这是力扣的283题,难度为简单,解题方案有很多种,本文讲解我认为最奇妙的三种。


一、题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums =[0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]

输出: [0]

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

进阶:你能尽量减少完成的操作次数吗?


二、题解

2.1 方法一:双指针

思路与算法:

使用双指针,i 指针指向当前已经处理好的序列的尾部,j 指针指向待处理序列的头部。

j 指针不断向右移动,每次 j 指针指向非零数,则将 i j 指针对应的数交换,同时 i 指针右移。

注意到以下性质:

  1. i 指针左边均为非零数;
  2. j 指针左边直到左指针处均为零。

因此每次交换,都是将 i 指针的零与 j 指针的非零数交换,且非零数的相对顺序并未改变。

2.2 方法二:两次遍历

思路与算法:

首先创建两个指针 i 和 j,第一次遍历的时候指针 j 用来记录当前有多少非 0 元素。

即遍历的时候每遇到一个非 0 元素就将其往数组左边挪,第一次遍历完后,j 指针的下标就指向了最后一个非 0 元素下标。

第二次遍历的时候,起始位置就从 j 开始到结束,将剩下的这段区域内的元素全部置为 0。

2.3 方法三:一次遍历

思路与算法:

参考了快速排序的思想,快速排序首先要确定一个待分割的元素做中间点 x,然后把所有小于等于 x 的元素放到 x 的左边,大于 x 的元素放到其右边。

这里我们可以用 0 当做这个中间点,把不等于 0(注意题目没说不能有负数)的放到中间点的左边,等于 0 的放到其右边。

这的中间点就是 0 本身,所以实现起来比快速排序简单很多,我们使用两个指针 i 和 j,只要 nums[i]!=0,我们就交换 nums[i] 和 nums[j]


三、代码

3.1 方法一:双指针

Java版本:

class Solution {
    public static void moveZeroes(int[] nums) {
        int n = nums.length;
        if (n == 0 || n == 1) return;
        int i = 0, j = 0;
        while (j < n) {
            if (nums[j] != 0) {
                reserve(nums, i, j);
                i++;
            }
            j++;
        }
    }

    void reserve(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

C++版本:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size(), i = 0, j = 0;
        while (j < n) {
            if (nums[j]) {
                swap(nums[i], nums[j]);
                i++;
            }
            j++;
        }
    }
};

3.2 方法二:两次遍历

Java版本:

class Solution {
    public static void moveZeroes1(int[] nums) {
        int n = nums.length;
        if (n == 0 || n == 1) return;
        int j = 0;
        for (int i = 0; i < n; i++) {
            if (nums[i] != 0) {
                nums[j++] = nums[i];
            }
        }
        for (int i = j; i < n; i++) {
            nums[i] = 0;
        }
    }
}

C++版本:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size();
        if (n == 0 || n == 1) return;
        int j = 0;
        for (int i = 0; i < n; i++) {
            if (nums[i] != 0) {
                nums[j++] = nums[i];
            }
        }
        for (int i = j; i < n; i++) {
            nums[i] = 0;
        }
    }
};

3.3 方法三:一次遍历

Java版本:

class Solution {
   public static void moveZeroes2(int[] nums) {
        int n = nums.length;
        if (n == 0 || n == 1) return;
        int j = 0;
        for (int i = 0; i < n; i++) {
            if (nums[i] != 0) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j++] = temp;
            }
        }
    }
}

C++版本:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size();
        if (n == 0 || n == 1) return;
        int j = 0;
        for (int i = 0; i < n; i++) {
            if (nums[i] != 0) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j++] = temp;
            }
        }
    }
};

四、复杂度分析

4.1 方法一:双指针

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。

4.2 方法二:两次遍历

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。

4.3 方法三:一次遍历

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。

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

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

相关文章

vue_域名部署无法访问后端

前言 目前部署的比较另类&#xff0c;因为服务器为windows&#xff0c;目前还不是很会nginx&#xff0c;所以现在就只能在服务器上安装nodejs&#xff0c;然后直接使用npm run dev命令行的方式运行项目 遇到的坑 使用ip访问前端的时候&#xff0c;就可以访问&#xff0c;但是…

户外用品网站搭建的效果如何

近几年户外运动成为热门话题&#xff0c;户外装备品牌也逐渐出现在人们眼前&#xff0c;新老企业都在用自己的方式提升品牌形象&#xff0c;包括帐篷、登山用具、钓鱼品、滑雪品等&#xff0c;在市场都有很高需求。 而在实际经营中&#xff0c;户外用品品牌也面临一些难题&…

【postgresql】PSQLException: An I/O error occurred while sending to the backend.

org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. 发送到后端时发生I/O错误。 java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 34284 尝试将超出范围的整数作为2字节值发送&#xff1a;34284 pos…

基于单片机的视力保护及身姿矫正器设计(论文+源码)

1. 系统设计 在本次设计中&#xff0c;其系统整个框图如图2-1所示。其主要的核心控制模块由超声波模块&#xff0c;光敏电阻&#xff0c;按键模块&#xff0c;复位电路&#xff0c;红外模块&#xff0c;LCD显示等组成。其包括自动模式&#xff0c;手动模式。自动模式&#xff…

天猫数据分析-天猫查数据软件-11月天猫平台饮料市场品牌及店铺销量销额数据分析

今年以来&#xff0c;饮料是快消品行业中少数保持稳定增长的品类之一。 11月份&#xff0c;饮料市场同样呈现较好的增长态势。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年11月份&#xff0c;天猫平台上饮料市场的销量为2700万&#xff0c;环比增长约42%&#xf…

Linux本地搭建StackEdit Markdown编辑器结合内网穿透实现远程访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

CentOS7安装Docker及添加阿里云镜像加速详细教程

Docker官方安装教程网站&#xff1a;Install Docker Engine on CentOS | Docker Docs 具体流程如下&#xff1a; 1.确定你是CentOS7及以上版本 cat /etc/redhat-release 2.yum安装gcc相关 yum -y install gcc yum -y install gcc-c 3.安装需要的软件包 3.1安装docker引擎…

Python:发送qq邮箱只需几行代码轻松搞定

一、前言 在日常业务中&#xff0c;经常会遇到需要程序发邮件提醒自己的情况。例如数据异常、工作任务进度完成情况、今日天气、今日股票行情等各种场景。如果引入发送邮箱以推进预期进度的功能&#xff0c;那将大大优化我们的日常。我也是近期在写国债逆回购的监控脚本时想起…

chatchat知识库对话接口修改成sse流式输出方案

在chatchat结合chatGLM搭建的私有化知识库中&#xff0c;使用原生的webUI画面是可以流式输出的&#xff0c;而直接调用api接口&#xff0c;不管stream为true还是false&#xff0c;都是阻塞式输出的&#xff0c;也就是一口气返回给接口。 我们的解决方案是修改StreamingRespons…

32位MCU极致性价比高速风筒方案特点--【其利天下技术】

近年来&#xff0c;伴随着人们消费升级及现代工业技术水平的提升&#xff0c;电吹风市场已经步入了绿色节能、高效多功能化的发展阶段。人们对电吹风的需求和要求都在不断增加。然而&#xff0c;传统电吹风采用交流电机&#xff0c;使用寿命有限&#xff0c;维护不方便&#xf…

C++1114新标准——Lambdas,decltype

系列文章目录 C11&14新标准——Variadic templates&#xff08;数量不定的模板参数&#xff09; C11&14新标准——Uniform Initialization&#xff08;统一初始化&#xff09;、Initializer_list&#xff08;初始化列表&#xff09;、explicit C11&14新标准—— d…

【Python数据分析系列】一文搞懂二维数组中的排列组合(案例源码)

一、问题场景 在工作中&#xff0c;我们经常会碰到这样的问题场景&#xff0c;有一个4行5列的二维数组&#xff08;4个波段&#xff0c;5个采样点&#xff09;&#xff0c;一行&#xff08;一个一维数组&#xff09;代表一个波段&#xff0c;我想知道数组中任意两个波段的差&am…

ESP32 连接阿里云 MQTT 报错MQTT Connect err:2

解决方法 跳转到 这个头文件<PubSubClient.h>里 MQTT_MAX_PACKET_SIZE 把这个的大小从原来的256 改为1024 MQTT_KEEPALIVE 把这个大小从原来的15 改为65 修改后再次连接即可成功 如下图&#xff1a;

下一代实时数据库:Apache Doris 【六】数据划分

3.4 数据划分 3.4.1 列定义3.4.2 分区与分桶3.4.3 PROPERTIES3.4.4 ENGINE3.4.5 其他后记 3.4 数据划分 以 3.3.2 的建表示例来理解。 3.4.1 列定义 以 AGGREGATE KEY 数据模型为例进行说明。更多数据模型参阅 Doris 数据模型。 列的基本类型&#xff0c; 可以通过在 mysql-cli…

【vSphere | VM】虚拟机自定义规范Ⅳ —— 使用虚拟机自定义规范创建 Linux 和 Windows VM

目录 5. 使用虚拟机自定义规范创建VM5.1 Linux 虚拟机示例Rocky Linux 9.2&#xff08;1&#xff09;克隆虚拟机&#xff08;2&#xff09;模板部署虚拟机 5.2 Windows 虚拟机示例Windows 10&#xff08;1&#xff09;克隆虚拟机&#xff08;2&#xff09;模板部署 Windows 10 …

Unity Meta Quest 一体机开发(十一):【手势追踪】远距离抓取

文章目录 &#x1f4d5;教程说明&#x1f4d5;玩家配置 DistanceHandGrabInteractor&#x1f4d5;物体配置 DistanceHandGrabInteractable&#x1f4d5;调整物体飞向手部的速度&#x1f4d5;调整探测物体的范围⭐HandFrustumNarraw⭐HandFrustumWide⭐HeadFrustum 此教程相关的…

高德地图画线,适用于在地图上画出各种道路

addPolyline() {let AMap this.AMaplet polyline new AMap.Polyline({// map: this.map,// polyline 路径path: [new AMap.LngLat("119.368904", "30.913423"),new AMap.LngLat("119.382122", "30.901176"),],strokeColor: #F3D930,…

MapReduce基础编程

文章目录 第1关&#xff1a;合并去重第2关&#xff1a;整合排序第3关&#xff1a;信息挖掘 第1关&#xff1a;合并去重 编程要求 对于两个输入文件&#xff0c;即文件A和文件B&#xff0c;请编写MapReduce程序&#xff0c;对两个文件进行合并&#xff0c;并剔除其中重复的内容…

Ngnix之反向代理、负载均衡、动静分离

目录 1. Ngnix 1.1 Linux系统Ngnix下载安装 1.2 反向代理 正向代理&#xff08;Forward Proxy&#xff09;&#xff1a; 反向代理&#xff08;Reverse Proxy&#xff09;&#xff1a; 1.3 负载均衡 1.4 动静分离 1. Ngnix Nginx是一个高性能的开源Web服务器&#xff0…

无惧数据泄露风险:迅软科技与电子科技公司共同谱写的安全合奏

当今&#xff0c;电子信息产品已广泛渗透到我们生活的各个领域&#xff0c;涵盖通信、医疗、计算机及其周边视听产品、玩具、军工等多个领域。电子信息科技行业作为典型的知识技术密集型行业&#xff0c;具备科技含量高、专利众多、知识产权丰富、核心数据密级高等特点。随着行…