LeetCode刷题笔记 | 283 | 移动零 | 双指针 |Java | 详细注释

🙋大家好!我是毛毛张!
🌈个人首页: 神马都会亿点点的毛毛张 原地移除元素2


LeetCode链接:283. 移动零


1.题目描述

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

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

示例 1:

复制代码
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

复制代码
输入: nums = [0]
输出: [0]

提示:

  • 1 < = n u m s . l e n g t h < = 1 0 4 1 <= nums.length <= 10^4 1<=nums.length<=104
  • − 2 31 < = n u m s [ i ] < = 2 31 − 1 -2^{31} <= nums[i] <= 2^{31} - 1 −231<=nums[i]<=231−1

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

2.题解

  • 注意这道题目需要保证非零元素的相对顺序,而这道题目的相对顺序可以改变:27.移除元素

2.1 双指针 | 一次遍历 | 操作次数多

java 复制代码
class Solution {
    public void moveZeroes(int[] nums) {
        // 使用双指针方法,一次遍历数组
        int left = 0, right = 0;
        
        // 遍历整个数组
        for (right = 0; right < nums.length; right++) {
            // 如果当前元素不是0
            if (nums[right] != 0) {
                // 交换当前元素和左指针指向的元素
                int temp = nums[right];
                nums[right] = nums[left];
                nums[left] = temp;
                // 左指针右移
                left++;
            }
        }
    }
}

2.2 双指针 | 两次遍历 | 操作次数少

java 复制代码
class Solution {
    public void moveZeroes(int[] nums) {
        // 第一次遍历,使用 j 指针记录非零元素的个数
        // 只要是非零元素,就将其赋给 nums[j]
        int j = 0;
        for (int i = 0; i < nums.length; ++i) {
            if (nums[i] != 0) {
                nums[j++] = nums[i];
            }
        }
        
        // 非零元素统计完了,剩下的元素都是零
        // 第二次遍历,将数组末尾的元素都赋值为零
        for (int i = j; i < nums.length; ++i) {
            nums[i] = 0;
        }
    }
}
相关推荐
红牛2030几秒前
Nexus Repository搭建maven远程仓库
java·maven·nexus
又是忙碌的一天2 分钟前
Maven基本概念
java·maven
艾醒6 分钟前
大模型原理剖析——解耦RoPE(旋转位置编码)的基本原理
算法
@淡 定9 分钟前
JVM内存区域划分详解
java·jvm·算法
❀͜͡傀儡师14 分钟前
运维问题排查笔记:磁盘、Java进程与SQL执行流程
java·运维·笔记
篱笆院的狗14 分钟前
Java 中如何创建多线程?
java·开发语言
默 语15 分钟前
RAG实战:用Java+向量数据库打造智能问答系统
java·开发语言·数据库
醒过来摸鱼17 分钟前
Java Compiler API使用
java·开发语言·python
客梦18 分钟前
数据结构-单链表
数据结构
M__3319 分钟前
动规入门——斐波那契数列模型
数据结构·c++·学习·算法·leetcode·动态规划