獲得的思考
獲得的思考
給定乙個陣列nums
,編寫乙個函式將所有0
移動到陣列的末尾,同時保持非零元素的相對順序。
示例:
輸入:[0
,1,0
,3,12
]輸出:[1
,3,12
,0,0
]
說明:
必須在原陣列上操作,不能拷貝額外的陣列。
儘量減少操作次數。
思路:先統計容器中0
的個數,刪掉所有的零,並在結尾補零
class
solution
else
++it;
}for
(int i =
0; i < count_0;
++i)
//結尾補0
nums.
push_back(0
);}}
;
這裡在剛開始用了一種迭代器失效的方法,erase
以後其實改變了容器元素的排列順序,遍歷下標i
其實就失效了,再根據i
來遍歷是錯的。erase
在刪除乙個迭代器指向的元素後,會返回已刪除元素的下乙個相鄰元素的迭代器,可以用erase
的返回值來重置迭代器it
,注意此時的for迴圈的++操作應在迴圈體內進行。
//for (int i = 0; i < nums.size(); i++)
//
// }
參考:如何正確刪除vector中的元素
class
solution}}
};
快指標i
指向最新的元素,慢指標j
指向【已確認的最後乙個非零元素】之後的第乙個0
。i
每次指向新的元素,如果nums[i]
是非零數,將nums[i]
與j
處的元素(其實是0)交換位置
參考:leetcode回答
還有更好地優化方法在官方回答中
參考:官方回答
測試用例
輸入:[0
,1,0
,3,12
]輸入:[1
,1,0
,3,12
]
這兩個測試用例主要是體會一下快慢指標的更新,手算一下就明白了
輸入:[0
,1,0
,3,12
]輸入:[1
,1,0
,3,12
]
這兩個測試用例主要是體會一下快慢指標的更新,手算一下就明白了
在原陣列上進行刪除某個特定值的元素時,使用erase
方法要注意迭代器失效的問題,erase
方法會返回已刪除元素的下乙個元素的迭代器,可以用erase
返回值來重置迭代器
移動零(力扣第283題)
給定乙個陣列nums,編寫乙個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。示例輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。解法 借助乙個慢指標,該指標用於指向從最左端開始的非零子陣列的最後乙個元素的後乙個元素,...
力扣刷題記錄 283 移動零
難度 簡單 題目描述 給定乙個陣列nums,編寫乙個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。解題語言 c 方法 雙指標 力扣官方 思路及解法 使用雙指標,左...
力扣日記 283 移動零
給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。方法一 class solution def movezeroes self,n...