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.
方法一:思路:使用一个动态数组 临时数组用来存储非0的元素;然后再赋值回原数组;
code:
class Solution {
public:
void moveZeroes(vector<int>& nums)
{
int n=nums.size();
vector<int>temp;
for(auto i:nums)
if(i)
temp.push_back(i);
for(int i=0;i<temp.size();i++)
nums[i]=temp[i];
for(int i=temp.size();i<n;i++)
nums[i]=0;
return ;
}
};
方法二:思路设置一个index=0;每当遇到一个非0的元素就直接赋值到nums[index++]=nums[i];
其余的全部设置为0;
code:
void moveZeroes(vector<int>& nums)
{
int n=nums.size();
int k=0;
for(int i=0;i<n;i++)
{
if(nums[i])
nums[k++]=nums[i];
}
for(int i=k;i<n;i++)
nums[i]=0;
return ;
}
方法三:遍历到第i个元素后 保证[0...i]中所有的非0元素
都按照顺序排列在[0...k]中;
同时[k..i]为0;
每次操作都是把到k的全部设置为非0的值
code:
void moveZeroes(vector<int>& nums)
{
int n=nums.size();
if(n==0||n==1)
return ;
int k=0;
for(int i=0;i<nums.size();i++)
if(nums[i])//只有在不为0的时候才做运算,不为0直接循环;
{
if(i!=k)
swap(nums[k++],nums[i]);
else //i==k
k++;
}
return ;
}