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?
// using additional array
public void moveZeros(int[] nums) {
int[] temp = new int[nums.length];
int p1 = 0, p2 = nums.length - 1;
for (int i : nums) {
if (i == 0) {
temp[p2] = i;
p2--;
} else {
temp[p1] = i;
p1++;
}
}
for (int i = 0; i < nums.length; i++) {
nums[i] = temp[i];
}
}
// using two pointer
public void moveZeros2(int[] nums) {
int p = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
swap(nums, i, p);
p++;
}
}
}
private void swap(int[] nums, int a, int b) {
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
// move all non-zeros to front then fill the rest with zeros
public void moveZeroes3(int[] nums) {
int p = 0;
for (int i : nums) {
if (i != 0) {
nums[p] = i;
p++;
}
}
for (int i = p; i < nums.length; i++) {
nums[i] = 0;
}
}