思路
使用雙指針法,一次遍歷完成原地修改。
- 慢指針
slow
:指向下一個非零元素應該被放置的位置。 - 快指針
fast
:遍歷整個數組,尋找非零元素。
當 fast
遇到非零數時,將其值賦給 slow
指向的位置,然后 slow
前進。fast
始終前進。
遍歷結束后,slow
指針左側(不含 slow
)都是排好序的非零元素。最后,將 slow
指針及之后的所有位置填充為 0
即可。
C++ 代碼實現
class Solution {
public:void moveZeroes(vector<int>& nums) {int slow = 0;// 將所有非零元素移動到數組前面for (int fast = 0; fast < nums.size(); ++fast) {if (nums[fast] != 0) {nums[slow++] = nums[fast];}}// 將 slow 及其之后的位置填充為 0while (slow < nums.size()) {nums[slow++] = 0;}}
};
復雜度
- 時間復雜度:
O(n)
,fast
指針遍歷數組一次。 - 空間復雜度:
O(1)
,原地操作,未使用額外空間。