雙指針算法
移動零
283. 移動零 - 力扣(LeetCode)
題目描述:
給定一個數組?nums
,編寫一個函數將所有?0
?移動到數組的末尾,同時保持非零元素的相對順序。
請注意?,必須在不復制數組的情況下原地對數組進行操作。
示例 1:
輸入: nums =[0,1,0,3,12]
輸出:[1,3,12,0,0]
示例 2:
輸入: nums =[0]
輸出:[0]
算法原理:
創建兩個指針dest,cur
兩個指針的作用:
cur:指向坐標為0的位置,從左往右掃描數組,遍歷數組
dest:指向坐標為-1的位置,在處理過的區間內,非零元素的最后一個位置,把處理過的區間分為非零區間和零區間
cur從左往右遍歷過程:
遇到0元素,cur++
遇到非0元素,dest++,dest與cur交換,cur++
代碼實現:
?class Solution {
public:void moveZeroes(vector<int>& nums) {for(int dest=-1,cur=0;cur<nums.size();cur++){if(nums[cur])//處理非0元素{swap(nums[++dest],nums[cur]);}}}
};?