目錄
寫在前面
1. 題目解析
2. 算法原理
3. 代碼編寫
寫在最后:
寫在前面
在進行了劍指Offer和LeetCode hot100的毒打之后,
我決心系統(tǒng)地學(xué)習(xí)一些經(jīng)典算法,增強我的綜合算法能力。
1. 題目解析
題目鏈接:283. 移動零 - 力扣(Leetcode)
讀完題目大概就能明白他的意思,
就是在不改變其他數(shù)字的情況下,把0都移動到數(shù)組最后面去。
2. 算法原理
這道題算是一道數(shù)組類的題目,而題目把數(shù)組分成了兩個區(qū)間,
左邊是放非0的數(shù),而右邊放的是0,
而解決這一類的題目有一個非常經(jīng)典的算法:雙指針算法,
說到雙指針算法,難道我們真的要用兩個指針來做這道題目嗎?
當(dāng)然不是,雙指針只是他的名字,實際上雙指針算法指的是:
利用數(shù)組下標來充當(dāng)指針,
那我們?nèi)绾问褂秒p指針算法來做這道題目呢?
我習(xí)慣創(chuàng)建兩個變量作為雙指針:left 和 right,
1. right 的作用是遍歷整個數(shù)組
2. left 的作用是作為分界線,左邊區(qū)間是已經(jīng)排好的,右邊區(qū)間是還沒排好的
讓 right 一直往后走(right++),
如果 right 所在的位置不為 0 ,就交換 left 和 right 位置的值,讓 left ++,
因為 left 和 right 的起始位置相同,
這樣就能保證當(dāng)他們開始交換的時候,left 一定待在 0 位置上,而 right 在非 0 位置上。
來我們開始編寫代碼:
3. 代碼編寫
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int size = nums.size(), left = 0, right = 0;
while (right < size) {
if(nums[right]) {
swap(nums[left], nums[right]);
left++;
}
right++;
}
}
};
寫在最后:
以上就是本篇文章的內(nèi)容了,感謝你的閱讀。
如果感到有所收獲的話可以給博主點一個贊哦。文章來源:http://www.zghlxwxcb.cn/news/detail-669885.html
如果文章內(nèi)容有遺漏或者錯誤的地方歡迎私信博主或者在評論區(qū)指出~文章來源地址http://www.zghlxwxcb.cn/news/detail-669885.html
到了這里,關(guān)于【算法專題突破】雙指針 - 移動零(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!