给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
个人AC答案 我总觉得应该不是这样的 肯定有更好的方法 可惜没实力
追记:我看到108ms的swap法 但是我这个效率理论上应该和swap差不多啊
但是MD我这个是12ms打败了99.2%的提交记录是什么鬼 完全没看懂
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
for(int i = 0; i < n; i++)
{
if(nums[i] == 0)
{
nums.erase(nums.begin() + i);
nums.push_back(0);
n--;
i--;
}
}
}
};
AC答案.改 减少删除操作次数 但是我通过时间反而更久了是什么鬼 完全没看懂系列
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
while(nums[n-1] != 0)
n--;
for(int i = 0; i < n; i++)
{
if(nums[i] == 0)
{
nums.erase(nums.begin() + i);
nums.push_back(0);
n--;
i--;
}
}
}
};
抄来的答案 感觉很厉害的样子 AC时间也是12ms 彻底迷茫了
另外发现我少做了空数组的细节 (但是也AC了 可能是case不够多
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
if(n == 0) return;
int k = 0;
for(int i=0;i<n;i++)
{
if(nums[i] != 0)
{
nums[k++] = nums[i];
}
}
while(k < n)
{
nums[k] = 0;
k++;
}
}
};