世界已冷酷至极, 让我们携手前行。
自助收录

283.移动零(双指针算法)

算法刷题2年前 (2023)更新 江南白衣
389 0 0
283.移动零(双指针算法)

283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
分析:
1、第一次遍历,使用双指针算法得到数组[1,3,12,3,12],以及slow的值(参考:27. 移除元素)
2、第二次遍历,将slow后面的元素全部置为0

package com.codernav.demo.leetcode.array.removeelement;

import java.util.Arrays;

/**
 * 283. 移动零
 * 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
 * 请注意 ,必须在不复制数组的情况下原地对数组进行操作。
 * 原文地址:https://www.codernav.com/2890.html
 * 更多算法详解:https://www.codernav.com
 */
public class Q_283 {
    public static void main(String[] args) {
        f(new int[]{0, 1, 0, 3, 12});
    }

    private static void f(int[] nums) {

        // 第一次遍历,得到数组[1,3,12,3,12],及slow值
        int slow = 0;
        for (int fast = 0; fast < nums.length; fast++) {
            if (nums[fast] != 0) {
                nums[slow] = nums[fast];
                slow++;
            }
        }

        // 第二次遍历,将slow后面的元素置为0
        for (int i = slow; i < nums.length; i++) {
            nums[i] = 0;
        }

        System.out.println("slow:" + slow + ", nums:" + Arrays.toString(nums));
    }
}

 

© 版权声明

相关文章

开发者导航新手教程

暂无评论

暂无评论...