https://leetcode.com/problems/move-zeroes/
給定一個數(shù)組,將其所有為0的元素移到數(shù)組后面去蹦浦,同時保持非零元素的相對位置不變
要求:不能新建一個數(shù)組空間;使得操作盡可能少
分析:
方法一:快慢指針
快指針在前面判斷該數(shù)是否是0延刘,慢指針在后面定位快指針找到的非零數(shù)應(yīng)該放到哪個位置搬素;等到快指針遍歷完整個數(shù)組后,再把0從慢指針的位置開始逐一補上去
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int insertposition = 0;
for(int i=0; i < nums.size(); ++i)
{
if(nums[i]!=0)
{
nums[insertposition++] = nums[i];
}
}
while(insertposition < nums.size())
{
nums[insertposition++] = 0;
}
}
法一 對于 000001 這樣的數(shù)組在最后面仍然需要做多次賦值0的操作吐限,這是可以避免的,融過將0和非零元素進行調(diào)換褂始,這樣子后面就不用賦值了诸典;
結(jié)果
Runtime: 12 ms, faster than 94.67% of C++ online submissions for Move Zeroes.
Memory Usage: 7.2 MB, less than 100.00% of C++ online submissions for Move Zeroes.
Next challenges
法二
這里同樣使用快慢指針,但是保證慢指針和快指針之間的數(shù)字為0崎苗,慢指針之前的數(shù)字為非0狐粱;
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int lastnon_zero = 0;
for(int i = 0; i < nums.size(); ++i)
{
if(nums[i]!=0)
{
swap(nums[lastnon_zero++], nums[i]);
}
}
}
};
Runtime: 12 ms, faster than 94.67% of C++ online submissions for Move Zeroes.
Memory Usage: 7.2 MB, less than 100.00% of C++ online submissions for Move Zeroes.
Next challenges
不過可以看到,時間并沒減少胆数,法一是賦值操作肌蜻;但后面法二多了swap對調(diào)操作