Move Zeroes

Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.

For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].
  • Note:
1. You must do this in-place without making a copy of the array.

2. Minimize the total number of operations.
  • Analysis:
Use two pointers, one is to find the zero and the other is to find non-zero.
  • Code - Java:
public class Solution {
    public void moveZeroes(int[] nums) {
        int len = nums.length;
        int left = 0;
        int right = 0;
        while (true) {
            while (left < len  && nums[left] != 0) {
                left++;
            }
            if (left == len) {
                break;
            }
            right = left;
            while (right < len && nums[right] == 0) {
                right++;
            }
            if (right == len) {
                break;
            }
            swap (nums, left, right);
            left++;
        }
    }
    private void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}
  • Code - C++:
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int size = nums.size();
        int left = 0;
        int right = 0;
        while (true) {
            while (left < size  && nums[left] != 0) {
                left++;
            }
            if (left == size) {
                break;
            }
            right = left;
            while (right < size && nums[right] == 0) {
                right++;
            }
            if (right == size) {
                break;
            }
            swap (nums, left, right);
            left++;
        }
    }
    void swap(vector<int>& nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
};
  • Code - Python:
class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        left, right, numLen = 0, 0, len(nums)
        while(True):
            while (left < numLen and nums[left] != 0):
                left += 1
            if (left == numLen):
                break
            right = left
            while (right < numLen and nums[right] == 0):
                right += 1
            if (right == numLen):
                break
            self.swap(nums, left, right)
            left += 1

    def swap(self, nums, left, right):
        temp = nums[left]
        nums[left] = nums[right]
        nums[right] = temp
  • Code - C:
void moveZeroes(int* nums, int numsSize) {
    int left = 0;
    int right = 0;
    while (true) {
        while (left < numsSize && nums[left] != 0) {
            left++;

        }
        if (left == numsSize) {
            break;
        }
        right = left;
        while (right < numsSize && nums[right] == 0) {
            right++;
        }
        if (right == numsSize) {
            break;
        }
        swap(nums, left, right);
        left++;
    }
}
void swap(int* nums, int left, int right) {
    int temp = nums[left];
    nums[left] = nums[right];
    nums[right] = temp;
}
  • Time Complexity: O(N), N is the length of array
  • Space Complexity: O(1)

results matching ""

    No results matching ""