题目:
给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
思路:
典型的双指针题目,用一个指针找到0,用另一个指针找到非零,两者交换,同时保证非零的指针较小。
class Solution { public: void moveZeroes(vector<int>& nums) { int length=nums.size(); int i=0,j=0; while(i<length&&j<length) { while(i<length&&nums[i]!=0) //find the num which is zero { i++; } j=i+1; while(j<length&&nums[j]==0) //not zero { j++; } if(i<length&&j<length) { std::swap(nums[i],nums[j]); i+=1;j+=1; } } } };
时间复杂度为O(n),看起来比较糟糕。看一下大佬的:
class Solution { public: void moveZeroes(vector<int>& nums) { auto it=nums.begin(); for(int i=0;i<nums.size();it++,i++ ) { if(*it==0) { nums.erase(it--); nums.push_back(0); } } } };
呀,看来我对vector还用不熟,看来有必要总结一下stl的vector了。