【LeetCode】283. 移动零

in #programming3 months ago

1 题目描述

283. 移动零要求给定一个整数数组 nums,编写一个函数将所有的 0 移动到数组的末尾,同时保持非零元素的相对顺序不变。该操作必须在原地完成,即不能使用额外的数据结构来存储数组。

2 解题思路

我们可以使用双指针的方法来解决这个问题:

  • left 指针指向下一个可能放置非零元素的位置。
  • right 指针用于遍历数组中的每一个元素。

right 指针遇到非零元素时,我们就把它交换到 left 指针所指向的位置,并将 left 指针向右移动一位。这样可以确保所有非零元素都被移到了数组的前面,而所有零元素都被移到了数组的后面。

3 Java 代码实现

public class Solution {
    public void moveZeroes(int[] nums) {
        int left = 0;  // 指向非零元素应该放置的位置
        int right = 0;  // 遍历数组

        for (; right < nums.length; right++) {  // 右指针始终向右移动
            if (nums[right] != 0) {
                // 交换非零元素到 left 指针位置
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;
                
                // 将 left 指针向右移动一位
                left++;
            }
        }
    }
}

4 注意事项

  • 双指针:使用双指针技术,其中 left 指针追踪新数组的当前位置,而 right 指针用于遍历整个数组。
  • 原地修改:直接在原数组上进行修改,不需要额外的空间。
  • 非零元素的相对顺序:通过交换元素的方式保持非零元素的相对顺序。