難度:簡(jiǎn)單題
題目
給定一個(gè)數(shù)組?nums
,編寫一個(gè)函數(shù)將所有?0
?移動(dòng)到數(shù)組的末尾,同時(shí)保持非零元素的相對(duì)順序。
請(qǐng)注意?,必須在不復(fù)制數(shù)組的情況下原地對(duì)數(shù)組進(jìn)行操作。
思路:
一開始想,從前往后遍歷,遇到0就挪到最后。類似于冒泡的思想,但是這樣做的話時(shí)間復(fù)雜度可能是 三次方。
再想,從前往后遍歷,利用 stl-vector 的特性,遇到0就從這個(gè)vector里面刪除當(dāng)前元素,但是刪除這個(gè)元素的話,該vector數(shù)組結(jié)構(gòu)會(huì)發(fā)生變化,即當(dāng)前下標(biāo)指向的自動(dòng)變?yōu)橄乱粋€(gè)元素,所以下標(biāo)這里要減1。
代碼:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
// 要保持非零元素的相對(duì)順序,不能排序!
// 依次遍歷,遇到0元素,則用冒泡排序的思想挪到最后 時(shí)間復(fù)雜度 三次方??
// 思路,依次遍歷,如果遇到0,則從vector中刪掉該元素,并記錄刪了幾個(gè),最后添上去
// 遍歷時(shí)刪元素會(huì)不會(huì)使數(shù)組下標(biāo)發(fā)生變化?會(huì)使數(shù)組結(jié)構(gòu)發(fā)生變化!
int i = 0;
int n = 0; // 記錄刪掉了幾個(gè)0
for(i = 0; i < nums.size(); i++){
if(nums[i] == 0){
nums.erase(nums.begin()+i);
n++;
i--; // 刪掉當(dāng)前元素,數(shù)組會(huì)立即發(fā)生變化!
}
}
// 刪了幾個(gè)元素,后面補(bǔ)幾個(gè)0
for(i = 0; i < n; i++){
nums.push_back(0);
}
}
};
運(yùn)行結(jié)果:
好吧,看了一下官方雙指針代碼,它的效果要好一點(diǎn)。。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int left = 0, right = 0;
int n = nums.size();
while(right < n){
if(nums[right]){
swap(nums[left], nums[right]);
left++;
}
right++;
}
}
};
?它的思路:
?文章來源地址http://www.zghlxwxcb.cn/news/detail-658107.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-658107.html
?
到了這里,關(guān)于leetcode283. 移動(dòng)零的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!