第一个版本:新建一个数组,用新建的数组放置数组中的非零元素。
时间复杂度:O(n) 空间复杂度:O(n)
void moreZeroes(vector<int>& nums) { vector<int> nonZeroesElements; for(int i=0;i<nums.size();i++) { if(nums[i]!=0) nonZeroesElements.push_back(nums[i]); //尾部插入数字:vector.push_back(a) }
for(int i=0;i<nonZeroesElements.size();i++)
nums[i]=nonZeroesElements[i];
for(int i=nonZeroesElements.size();i<nums.size();i++)
nums[i]=0;
}
第二个版本优化了空间复杂度。
时间复杂度:O(n) 空间复杂度:O(1)
//第二个版本 void moreZeroes(vector<int>& nums) { int k=0; //nums中非零元素为[0...k) //遍历到第i个元素后,保证[0...i]中的所有非0元素 //都按照顺序排在[0...k)中 for(int i=0;i<nums.size();i++) { if(nums[i]!=0) nums[k++]=nums[i]; } //剩余的位置赋值为0 for(int i=k;i<nums.size();i++) nums[i]=0; }
第三个版本简化了代码
//第三个版本 void moreZeroes(vector<int>& nums) { int k=0; //nums中非零元素为[0...k) //遍历到第i个元素后,保证[0...i]中的所有非0元素 //都按照顺序排在[0...k)中 for(int i=0;i<nums.size();i++) { if(nums[i]!=0) swap(nums[k++],nums[i]); //两个数字交换位置 } }