题目描述:
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.
Example:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations.
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
解法一:
该题相对较容易,只要遍历一遍数组,任何不为 0 的元素都向前移动即可,最后补 0。
public void moveZeroes(int[] nums) {
int index = 0;
for ( int i = 0 ; i < nums.length ; i ++ )
if ( nums[i] != 0 ) // 向前移动
nums[ index++ ] = nums[i];
while ( index < nums.length ) // 补 0
nums[ index++ ] = 0;
}
时间复杂度:
空间复杂度:
解法二:
解法一的优化版本,每次不为 0 的元素向前移动的时候,都顺便将当前元素置位 0 ,这样就省去了最后置 0 的操作。
public void moveZeroes2(int[] nums) {
int num_non_zeroes = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[num_non_zeroes++] = nums[i];
nums[i] = 0;
}
}
}
时间复杂度:
空间复杂度: