题目描述
链接: https://leetcode-cn.com/problems/move-zeroes/submissions/
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
1必须在原数组上操作,不能拷贝额外的数组。
2尽量减少操作次数。
解题思路
这道题我们直接用双指针的快慢指针进行遍历即可.
慢指针指向要被替换的下标, 快指针遍历整个列表.
注意: 不能替换后直接nums[fast] = 0, 这样当快慢指针指向同一元素且为非0(不用动)时,根据代码会变成0.
复杂度分析
T: O(n)
S: O(1)
代码
class Solution {
public void moveZeroes(int[] nums) {
int fast = 0, slow = 0;
while (fast < nums.length) {
if (nums[fast] == 0) {
fast++;
} else {
//解法1: 不进行交换, 进行覆盖, 则需要循环结束后把剩余部分置0
//解法2: 进行交换(fast与slow交换, 则不需要再置0).
nums[slow] = nums[fast];
slow++;
fast++;
}
}
while (slow < nums.length) {
nums[slow] = 0;
slow++;
}
}
}
京公网安备 11010502036488号