LeetCode-283. 移动零

题目来源

283. 移动零

题目详情

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

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

题解分析

解法一:双指针法

  1. 本题虽然使用枚举法可以解决,但是显然时间复杂度太大,不是最优的解法。
  2. 其实,这道题目的核心思路就是交换非零和零元素,只不过每次交换的时候需要保持非零元素的位置相对不变。要实现这个目的,可以使用双指针的方法。
  3. 通过将左指针指向零,而右指针指向非零元素,每次右指针往右移动,当遇到非零元素时,将左右指针的元素对换,这样也就保证了非零元素的相对位置不变。
  4. 值得注意的是:左指针左边均为非零数;右指针左边直到左指针处均为零。
class Solution {
    public void moveZeroes(int[] nums) {
        int n = nums.length;
        int left = 0, right = 0;
        while(right < n){
            if(nums[right] != 0){
                // 交换左右指针,交换之前左指针指向零,右指针指向非零
                swap(nums, left, right);
                left++;
            }
            right++;
        }
    }
    private void swap(int[] nums, int left, int right){
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}

结果展示

image

posted @ 2022-01-18 19:47  Garrett_Wale  阅读(47)  评论(0编辑  收藏  举报