美文网首页
LeetCode - 283. 移动零 Java

LeetCode - 283. 移动零 Java

作者: huxq_coder | 来源:发表于2020-08-13 20:54 被阅读0次

    说明:
    https://leetcode-cn.com/problems/move-zeroes/

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

    示例:

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

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

    通过快慢指针,一次遍历,快指针正常向后遍历,慢指针指向最后一个非零的元素,找到非零元素,将非零元素赋值给慢指针的位置,将非零元素赋值为零。具体算法演进过程见swift版本:https://www.jianshu.com/p/b5bcab69913d

    时间复杂度为O(n)
    空间复杂度为0(1)
    算法:

    class Solution {
        public void moveZeroes(int[] nums) {
            // 数组元素个数小于2,无需处理
            if (nums.lenght < 2) {
                return;
            }
            // 快指针:i;慢指针:lastNonZeroIndex
            int lastNonZeroIndex = 0;
            for(int i = 0; i < nums.length; i++) {
                // 判断非零元素
                if(nums[i] != 0) {
                    // 避免 i == lastNonZeroIndex 时多余的操作
                    if(i > lastNonZeroIndex) {
                        // 此处可以使用快慢指针位置元素的交换,因为是和确定的元素0交换,所以可以直接赋值
                        // 将后面的非零元素赋值到前面的慢指针位置
                        nums[lastNonZeroIndex] = nums[i];
                        // 非零元素赋值为0
                        nums[i] = 0;
                    }
                    lastNonZeroIndex++;
                }
            }
        }
    }
    

    作者:huxq-coder
    链接:https://leetcode-cn.com/problems/move-zeroes/solution/kuai-man-zhi-zhen-by-huxq-coder/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:LeetCode - 283. 移动零 Java

          本文链接:https://www.haomeiwen.com/subject/cqwidktx.html