水平有限,不足之处还望指正。
题目:
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.
For example, given nums = [0, 1, 0, 3, 12]
, after calling your function, nums
should be [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元素 移到数组末端,非零元素保持原有的相对位置。
解题思路:
1. 时间复杂度O(n):从前往后扫描,将非零元素逐个放置到数组前端,非零元素原有位置置为零。
2. 时间复杂度O(n^2):从后往前将 非零元数块 往前搬移 用start与end分别表示 非零元素块的头和尾 。
时间复杂度O(n)的AC代码如下(含有main函数,VS2013中可直接运行):
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
void moveZeroes(vector<int>& nums)
{
int index = 0; //index代表从前往后放置非零元素的位置
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] != 0)
{
nums[index] = nums[i];
if (index != i) //仅当index与i指向不同元素时才将i指向位置的元素置为0
nums[i] = 0; //没有这个判断 导致全部非零的数组 输出全为 0
index++;
}
}
}
};
int main()
{
vector<int> nums = { 0, 1, 0, 3, 12 };
Solution my_solution;
my_solution.moveZeroes(nums);
for (int i = 0; i < nums.size(); i++)
cout << nums[i] << " ";
cout << endl;
return 0;
}
时间复杂度O(n^2)的 AC代码如下(含有main函数,VS2013中可直接运行):
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
void moveZeroes(vector<int>& nums)
{
int end = nums.size() - 1;
int start = nums.size() - 1;
for (int i = nums.size() - 1; i >= 0; i--)
{
if (nums[i] != 0)
{
--start;
}
else
{
for (int j = start; j < end; j++)
{
nums[j] = nums[j + 1];
}
nums[end] = 0;
--end;
--start;
}
}
}
};
int main()
{
vector<int> nums = { 0, 1, 0, 3, 12 };
Solution my_solution;
my_solution.moveZeroes(nums);
for (int i = 0; i < nums.size(); i++)
cout << nums[i] << " ";
cout << endl;
return 0;
}