首先是题目描述:
Given an array nums
, write a function to move all 0
's to the end of it while maintaining the relative order of the non-zero elements.
Example:
Input:[0,1,0,3,12]
Output:[1,3,12,0,0]
Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations.
这道题是一道easy程度的题,先奉上我的代码。
#include <iostream>
#include <vector>
using namespace std;
class solution{
public:
void moveZeroes(vector<int>& nums){
vector<int> result;
//时间复杂度O(n),空间复杂度O(n)
for(int i=0;i<nums.size();i++)
if(nums[i]) {
result.push_back(nums[i]);
}
for(int i=0;i<result.size();i++)
nums[i]=result[i];
for(int i=result.size();i<nums.size();i++){
nums[i]=0;
}
/* //空间复杂度O(1)
int k=0;//nums中,[0...k)的元素均为非0元素;
//遍历i个元素后,保证[0...i]中所有非0元素都按照顺序排列在[0...k)中
for(int i=0;i<nums.size();i++)
if(nums[i])
nums[k++]=nums[i];
for(int i=k;i<nums.size();i++)
nums[i]=0;*/
}
};
int main() {
int arr[]={0,1,1,3,12};
vector<int> vec(arr,arr+sizeof(arr)/sizeof(int));
solution().moveZeroes(vec);
for(int i=0;i<vec.size();i++)
cout<<vec[i]<<" ";
cout<<endl;
return 0;
}
第一种思想是取出全部不为零的数字覆盖数组前面,再将为零的放到数组后面,但是此种做法,时间和空间复杂度都为O(n),第二种思想是不申请空间,直接将前k个非零元素依次放入数组中,在数组后面追加0,但是以上两种做法最后都使用了将0赋值的操作,所以第三种思想是,将0元素交换到数组后面,代码如下:
#include<algorithm>
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int k=0;//nums中,[0...k)的元素均为非0元素;
//遍历i个元素后,保证[0...i]中所有非0元素都按照顺序排列在[0...k)中
//同时,[k...i]为0
for(int i=0;i<nums.size();i++)
if(nums[i])
if(i!=k)
swap(nums[k++],nums[i]);
else //i==k
k++;
}
};
此时需要考虑一种特殊情况就是排除0自己和自己交换,所以这里判断i!=k,执行交换操作,如果i==k,就让k,继续向前移动。