給定一個數(shù)組?nums
,編寫一個函數(shù)將所有?0
?移動到數(shù)組的末尾,同時保持非零元素的相對順序。
請注意?,必須在不復制數(shù)組的情況下原地對數(shù)組進行操作。
示例 1:
輸入: nums =[0,1,0,3,12]
輸出:[1,3,12,0,0]
示例 2:
輸入: nums =[0]
輸出:[0]
提示:
1 <= nums.length <= 104
-231?<= nums[i] <= 231?- 1
進階:你能盡量減少完成的操作次數(shù)嗎?
直接采用快排中的思想,采用雙指針的思想,把數(shù)組劃分為三個區(qū)域來處理
當?shù)谝粋€區(qū)域的順序正確,第二個區(qū)域都是0,且數(shù)組內(nèi)以及沒有要處理的元素時,該數(shù)組就符合題目要求處理完畢了。因為必須保證除0外數(shù)組中元素原有順序不能被打亂,所以發(fā)現(xiàn)0后需要將之后非0元素一個一個挨著往前移動。所以需要兩個指針,因為這里是數(shù)組,所以直接用下標就可以解決問題。文章來源:http://www.zghlxwxcb.cn/news/detail-836140.html
將dest=-1;cur=0;讓cur先走,如果等于零就跳過,當找到下一個非0元素時就直接和++dest換位置,如果cur就在dest之前,那++dest再換位置就等于沒換,只有遇到0時cur和dest中間才會隔出來元素,從而交換后直接把0移動到后面,把后面的元素移動到原本0的位置,就實現(xiàn)了題目的要求,代碼很簡單,一個for循環(huán)直接搞定。文章來源地址http://www.zghlxwxcb.cn/news/detail-836140.html
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]);
}
}
}
};
到了這里,關(guān)于Leetcode 283.移動零的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!