您的位置:首页 > 其它

(数组)leetcode 283:Move Zeroes

2016-01-07 16:47 351 查看
水平有限,不足之处还望指正。

题目:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: