力扣283

移动零的算法

在编程中,处理数组时常会遇到需要对特定元素进行操作的情况。今天,我们将讨论一个常见的问题:如何将数组中的所有零移动到末尾,同时保持非零元素的相对顺序。

问题描述

给定一个数组 nums,你需要将所有 0 移动到数组的末尾,同时保持其他非零元素的相对顺序。请注意,必须在原地操作,不要使用额外的数组空间。

示例

输入:

[0, 1, 0, 3, 12]

输出:

[1, 3, 12, 0, 0]

算法思路

我们的思路是使用两个指针来实现这个任务。第一个指针遍历整个数组,第二个指针用于记录下一个非零元素应该放置的位置。

  1. 初始化一个索引变量 index 为 0,用于指向下一个非零元素的位置。
  2. 遍历数组,如果当前元素不是 0,就将其放置在 index 指向的位置,并将 index 增加 1。
  3. 在第一轮遍历结束后,index 的值将指向所有非零元素后的位置,因此我们可以在从 index 到数组末尾的范围内填充 0。

代码实现

以下是实现这一算法的 Java 代码:

class Solution {
    public void moveZeroes(int[] nums) {
        int index = 0;
        for(int i = 0; i < nums.length; i++){
            if(nums[i] != 0){
                nums[index] = nums[i];
                index++;
            }
        }
        for(int i = index; i < nums.length; i++){
            nums[i] = 0;
        }
    }
}

代码解析

  1. 初始化索引:

    int index = 0;
    

    创建一个 index 变量,用于跟踪下一个非零元素的位置。

  2. 遍历数组:

    for(int i = 0; i < nums.length; i++){
        if(nums[i] != 0){
            nums[index] = nums[i];
            index++;
        }
    }
    

    通过第一个 for 循环遍历数组,将非零元素移动到前面。每当我们找到一个非零元素,就将其放在 index 指向的位置,并增加 index

  3. 填充零:

    for(int i = index; i < nums.length; i++){
        nums[i] = 0;
    }
    

    在第二个 for 循环中,从 index 开始,将剩余的位置填充为 0。

时间复杂度

  • O(n): 我们只需遍历数组两次,因此时间复杂度为线性。

空间复杂度

  • O(1): 我们只使用了常数级别的额外空间。

总结

通过使用双指针的方法,我们能够有效地将数组中的零移动到末尾,同时保持其他元素的相对顺序。这种方法不仅高效,而且简单易懂。在实际应用中,这种策略可以被扩展到其他类型的元素移动问题上。

希望这篇文章能帮助你更好地理解如何处理数组中的元素移动问题!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值