题目描述:
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]
解题思路1:类似于冒泡排序算法,两重循环,可以把0都移动到最后。
代码如下:
class Solution {
public void moveZeroes(int[] nums) {
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]==0){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
}
}
分析:两重循环的解法时间复杂度是O(n^2),有没有改进的空间呢?答案当然是有的。
解题思路2:利用单循环实现,循环的时候把值为零的元素用下一个非零元素代替,也就是用非零的元素覆盖零元素,然后在数组后面用0补齐,使其长度等于原来的长度。这样的话,时间复杂度从O(n^2)变为O(n)。
代码如下:
class Solution {
public void moveZeroes(int[] nums) {
int index = 0;
for (int i = 0; i < nums.length; i++){
if (nums[i] != 0){
nums[index++] = nums[i];
}
}
for (int i = index; i < nums.length; i++){
nums[i] = 0;
}
}
}