寒光博客

[LeetCode]283.移动零
题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入...
扫描右侧二维码阅读全文
08
2020/07

[LeetCode]283.移动零

题目

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

示例:

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

说明:

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

分析及反思

思考了半天 先想到的是

暴力

,从最后面开始扫加粗文字
扫到零 就把0和之后的数字全部swap一遍 然后缩小边界 继续找下一个0

14:23   info
        解答成功:
        执行耗时:11 ms,击败了5.02% 的Java用户
        内存消耗:40.3 MB,击败了5.62% 的Java用户

然后看了一下评论区大佬的双指针解法。
真的是妙脆角到家,妙脆角他妈给妙脆角开门,妙到家了!!
填充法吧,把所有的数字除0外依次从i=0放入:遇到0跳过放入下一个数组
最后把空位不0即可!

代码

妙解

void moveZeroes(int* nums, int numsSize) {
    int i = 0,j = 0;
    for(i = 0 ; i < numsSize; i++)
    {
        if(nums[i] != 0)
        {
            nums[j++] = nums[i];
        }
    }
    while(j < numsSize)
    {
        nums[j++] = 0;
    }
}

暴力

class Solution {
    public void moveZeroes(int[] nums) {
        int k = 0;
        for (int i = nums.length - 1; i >= 0; i--) {
            if (nums[i] == 0) {
                for (int j = i; j < nums.length - k - 1; j++) {
                    swap(nums, j, j + 1);
                }
                k++;//0个数 边界缩小
            }
        }
    }

    public void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
}
本文作者:Author:     文章标题:[LeetCode]283.移动零
本文地址:http://dxoca.cn/Algorithm/373.html       百度已收录
版权说明:若无注明,本文皆为“Dxoca's blog (寒光博客)”原创,转载请保留文章出处。
Last modification:July 8th, 2020 at 05:19 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment