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;
        }
    }
}
相关推荐
李慕婉学姐5 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
孙严Pay5 小时前
快捷支付:高效安全的在线支付新选择
笔记·科技·计算机网络·其他·微信
じ☆冷颜〃5 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
数据大魔方5 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
POLITE35 小时前
Leetcode 23. 合并 K 个升序链表 (Day 12)
算法·leetcode·链表
楚来客6 小时前
AI基础概念之八:Transformer算法通俗解析
人工智能·算法·transformer
Echo_NGC22376 小时前
【神经视频编解码NVC】传统神经视频编解码完全指南:从零读懂 AI 视频压缩的基石
人工智能·深度学习·算法·机器学习·视频编解码
会员果汁7 小时前
leetcode-动态规划-买卖股票
算法·leetcode·动态规划
数据皮皮侠AI7 小时前
上市公司股票名称相似度(1990-2025)
大数据·人工智能·笔记·区块链·能源·1024程序员节
奋进的芋圆7 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq