(数组)leetcode 283:Move Zeroes
2016-01-07 16:47
351 查看
水平有限,不足之处还望指正。
题目:
Given an array
to the end of it while maintaining the relative order of the non-zero elements.
For example, given
be
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中可直接运行):
时间复杂度O(n^2)的AC代码如下(含有main函数,VS2013中可直接运行):
题目:
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,
numsshould
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; }
相关文章推荐
- 浮动布局-基于display:inline-block的列表布局
- Spring避免构造注入型歧义
- SQL笔记(14)_第十四章 使用子查询定义未确定数据
- 回调函数
- [Leetcode]@python 65. Valid Number
- 2016/1/7 改 百文百鸡 水仙花数 百马百担
- Centos 下编译安装Redis
- android程序内存泄漏的原因和解决办法
- HTTP状态码总结
- 4.6. Defining Functions(定义函数)
- JAVA学习【4】String类不可改变
- C++的fill函数和memset函数
- 正篇 三. 框架的选择
- 从apach到nginx的那些坑
- 经典SQL练习题
- Learning part-based templates from large collections of 3D shapse CorrsTmplt Kim 代码调试
- android 关于Toast重复显示解决方法
- spring mvc+mybatis ehcache缓存配置
- Linux文件和目录管理常用命令(下)
- C# 多线程写日志文件,锁定日志文件