一、题目
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
二、题解
法1
- 若nums[i]为0,则找到后项里第一个不为零的数交换
- 如00203——20003——23000
- 若nums[i]不为0,则不需要操作——保持非零元素相对顺序
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++) {
int temp;
if (nums[j]!=0) {
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
break;
}
}
}
}
}
}
- 时间复杂度O(n^2)
- 空间复杂度O(1)
- 执行用时:6 ms, 在所有 Java 提交中击败了9.86%的用户
- 内存消耗:39 MB, 在所有 Java 提交中击败了63.61%的用户
法2
-
用一个指针存非零元素的位置,把非零的数按相对顺序排放在数组
-
在从非零元素个数起,遍历一遍nums,全部赋值0
public void moveZeroes(int[] nums) {
int notZero = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i]!=0){
nums[notZero] = nums[i];
notZero++;
}
}
for (int i = notZero; i < nums.length; i++) {
nums[i] = 0;
}
}
- 时间复杂度O(n)
- 空间复杂度O(1)
- 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
- 内存消耗:39 MB, 在所有 Java 提交中击败了75.56%的用户