算法:移动零283. Move Zeroes

Posted 架构师易筋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:移动零283. Move Zeroes相关的知识,希望对你有一定的参考价值。

283. Move Zeroes

Given an integer array nums, move all 0’s to the end of it while maintaining the relative order of the non-zero elements.

Note that you must do this in-place without making a copy of the array.

Example 1:

Input: nums = [0,1,0,3,12]
Output: [1,3,12,0,0]

Example 2:

Input: nums = [0]
Output: [0]

Constraints:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

Follow up: Could you minimize the total number of operations done?

1. 记住0的index解法

public class Solution {

	public void moveZeroes(int[] nums) {
	
	    int j = 0;
	    for(int i = 0; i < nums.length; i++) {
	        if(nums[i] != 0) {
	            int temp = nums[j];
	            nums[j] = nums[i];
	            nums[i] = temp;
	            j++;
	        }
	    }
	}
}


2. 滚雪球解法

这个想法是我们遍历数组并收集我们路上的所有零。

让我们以我们的例子为例:
第一步 - 我们遇到 0。
好吧,请记住现在我们的雪球的大小是 1。再进一步。

下一步 - 我们遇到 1。将雪球最左边的 0 与元素 1 交换。


下一步——我们再次遇到0!

我们的球变大了,现在它的大小 = 2。

下一步 - 3. 与最左边的零再次交换。

看起来我们的零一直在滚动

下一步 - 12. 再次交换:

我们到达了终点!恭喜!

class Solution {
     public void moveZeroes(int[] nums) {
        int snowBallSize = 0; 
        for (int i=0;i<nums.length;i++){
	        if (nums[i]==0){
                snowBallSize++; 
            }
            else if (snowBallSize > 0) {
	            int t = nums[i];
	            nums[i]=0;
	            nums[i-snowBallSize]=t;
            }
        }
    }
}

参考

https://leetcode.com/problems/move-zeroes/discuss/172432/THE-EASIEST-but-UNUSUAL-snowball-JAVA-solution-BEATS-100-(O(n))-%2B-clear-explanation

以上是关于算法:移动零283. Move Zeroes的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 283. Move Zeroes 移动零

LeetCode 283. Move Zeroes (移动零)

LeetCode 283. 移动零 Move Zeroes (Easy)

LeetCode 283 Move Zeroes(移动全部的零元素)

LeetCode 283. Move Zeroes

LeetCode 283 Move Zeroes