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;
        }
    }
}
相关推荐
weixin_4569042716 分钟前
C# 中的回调函数
java·前端·c#
程序员水自流24 分钟前
MySQL InnoDB存储引擎关键核心特性详细介绍
java·数据库·mysql
Chen不旧36 分钟前
easyexcel实现excel读取
java·excel·easyexcell
少许极端37 分钟前
算法奇妙屋(五)-链表
数据结构·算法·链表
码界奇点1 小时前
Spring Web MVC构建现代Java Web应用的基石
java·前端·spring·设计规范
XISHI_TIANLAN1 小时前
【多模态学习】Q&A6: 什么是MOE架构?Router Z Loss函数是指什么?负载均衡损失(Load Balancing Loss)又是什么?
学习·算法·语言模型
木子.李3471 小时前
数据结构-算法C++(额外问题汇总)
数据结构·c++·算法
板板正1 小时前
EasyExcel实现普通导入导出以及按模板导出excel文件
java·excel
花心蝴蝶.1 小时前
API签名认证算法全解析
算法
野犬寒鸦1 小时前
从零起步学习Redis || 第十章:主从复制的实现流程与常见问题处理方案深层解析
java·服务器·数据库·redis·后端·缓存