给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。
思路一:冒泡法
利用冒泡排序的思路,把0一个一个的都冒到数组的末尾。
- 时间复杂度:O(n2)
- 空间复杂度:O(1)
class Solution {
public void moveZeroes(int[] nums) {
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
for(int j=i+1;j<nums.length;j++){
if(nums[j]!=0){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
break;
}
}
}
}
}
}
思路二:双指针
用一个指针 i 遍历整个数组,另一个指针 j 指向每一个非0元素。每遇到一个非0元素,就把它的值赋值给nums[j]。这其实就相当于在原来的数组上建立了一个新的数组(没有0),最后将剩下的位置用0填充。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public void moveZeroes(int[] nums) {
for(int i=0,j=0;i<nums.length;i++){
if(nums[i]!=0){
if(i!=j){
nums[j] = nums[i];
nums[i] = 0;
}
j++;
}
}
}
}