283. 移动零
一、题目
给定一个数组 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
class Solution {
public void moveZeroes(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i]!=0) {
nums[j] = nums[i];
j++;
}
}
for (int i = j; i < nums.length; i++) {
nums[i] = 0;
}
}
}
- 时间复杂度O(n)
- 空间复杂度O(1)
- 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
- 内存消耗:39 MB, 在所有 Java 提交中击败了75.56%的用户

浙公网安备 33010602011771号