要求

将所有的0,移动到vector的后面
比如; [1,3,0,12,5] -> [1,3,12,5,0]

实现

第一版程序,时间、空间复杂度都是O(n)

 1 #include<iostream>
2 #include<vector>
3
4 using namespace std;
5
6 class Solution{
7 public:
8 void moveZeros(vector<int>& nums){
9 vector<int> nonZeroElements;
10 for( int i = 0 ; i < nums.size() ; i ++ )
11 if( nums[i] )
12 nonZeroElements.push_back(nums[i]);
13 for( int i = 0 ; i < nonZeroElements.size() ; i ++ )
14 nums[i] = nonZeroElements[i];
15 for( int i = nonZeroElements.size() ; i < nums.size() ; i ++ )
16 nums[i] = 0;
17 }
18 };
19
20 int main(){
21 int arr[] = {0, 1, 0, 3, 12};
22 vector<int> vec(arr, arr + sizeof(arr)/sizeof(int) );
23 Solution().moveZeros( vec );
24 for( int i = 0 ; i < vec.size() ; i ++ )
25 cout<<vec[i]<<" ";
26 cout<<endl;
27 }

优化后,空间复杂度O(1)

 1 class Solution{
2 public:
3 // 索引
4 void moveZeros(vector<int>& nums){
5 int k = 0;
6 // 遍历到第i个元素后,保证[0...i)中所有非0元素
7 // 均按顺序排列在[0...k)中
8 for( int i = 0 ; i < nums.size() ; i ++ )
9 if( nums[i] )
10 nums[k++] = nums[i];
11 // 将[k...n]赋值为0
12 for( int i = k ; i < nums.size() ; i ++ )
13 nums[i] = 0;
14 }
15 }

利用交换,提高效率

1 void moveZeros1(vector<int>& nums){
2 int k = 0;
3 for( int i = 0 ; i < nums.size() ; i ++ )
4 if( nums[i] )
5 swap( nums[k++] , nums[i] );
6 }

增加判断,提高非零元素较多时的效率

 1 void moveZeros1(vector<int>& nums){
2 int k = 0;
3 for( int i = 0 ; i < nums.size() ; i ++ )
4 if( nums[i] )
5 // 指向同一个元素时不交换
6 if( i != k )
7 swap( nums[k++] , nums[i] );
8 else // i == k
9 k++;
10 }

>> 1 3 2 12 0 0

要点

  • k始终指向第一个0
  • 每次交换后k后移

总结

  • 算法设计是一个过程
  • 索引非常重要,顺序、选择、循环、交换都是索引的操作而已,每个索引都必须知道自己要去做什么
  • 一开始的设计可以是粗粒度的,但不代表不对,只是效率低(时间、空间)
  • 发现问题,解决问题,逐步优化
  • 不要一开始就陷入测试用例中(先想好怎么操作球,而不去看球上的数字)
  • 语法是次要的,思路是主要的,语言的底层都是系统命令
  • 设计算法的步骤:思路-->实现-->优化
  • 如果看到理解不了思路的复杂算法,不要硬想,有可能是考虑了某种因素的优化版本,先学习容易理解的版本,了解其不足,想想如何在其基础上优化,复杂版本自然就懂了
  • 算法就是做一件事的流程,进一步抽象,由三部分组成
    • 手:变量,索引,指针
    • 物品:数据
    • 工具:容器,数组,栈,内存
  • 设计一个算法,就是要想清楚怎么用手借助工具去操作物品,即指针如何利用内存操作数据
  • 操作的方式是循环(递归),即在n-1步正确为前提,证明n步正确
  • 数据结构作为算法的工具,封装了规则,而规则的实现又要依赖于算法
  • 数据结构通常以类的形式实现,类中的数据不是真实的数据,而是“虚拟”出来的待操作数据,类中的方法就是算法

[刷题] 283 Move Zeros的更多相关文章

  1. LeetCode 283 Move Zeros

    Problem: Given an array nums, write a function to move all 0's to the end of it while maintaining th ...

  2. leetcode 283 Move Zeros; 27 Remove Elements; 26 Remove Duplicated from Sorted Array;

    ,,,,}; //把数组的值赋给vector vector<int> vec(arr, arr+sizeof(arr)/sizeof(int)); 解法一: 时间复杂度O(n) 空间复杂度 ...

  3. LeetCode刷题记录(python3)

    由于之前对算法题接触不多,因此暂时只做easy和medium难度的题. 看完了<算法(第四版)>后重新开始刷LeetCode了,这次决定按topic来刷题,有一个大致的方向.有些题不止包含 ...

  4. leetcode 刷题记录(java)-持续更新

    最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...

  5. C#LeetCode刷题-双指针

    双指针篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.5% 中等 11 盛最多水的容器   43.5% 中等 15 三数之和   16.1% 中等 16 最接近的三数之和   3 ...

  6. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

  7. 283. Move Zeroes(C++)

    283. Move Zeroes Given an array nums, write a function to move all 0's to the end of it while mainta ...

  8. LeetCode Javascript实现 283. Move Zeroes 349. Intersection of Two Arrays 237. Delete Node in a Linked List

    283. Move Zeroes var moveZeroes = function(nums) { var num1=0,num2=1; while(num1!=num2){ nums.forEac ...

  9. [LeetCode] 系统刷题5_Dynamic Programming

    Dynamic Programming 实际上是[LeetCode] 系统刷题4_Binary Tree & Divide and Conquer的基础上,加上记忆化的过程.就是说,如果这个题 ...

随机推荐

  1. 数据仓库系列之ETL中常见的增量抽取方式

    为了实现数据仓库中的更加高效的数据处理,今天和小黎子一起来探讨ETL系统中的增量抽取方式.增量抽取是数据仓库ETL(数据的抽取(extraction).转换(transformation)和装载(lo ...

  2. day-06-集合-缓存机制-深浅copy

    (1) is id ==用法 is 判断的是内存地址是否相同 id 查看内存地址:id相同,值一定相同,值相同,id不一定相同 == 比较判断是否相等 l1 = [1, 2, 3] l2 = [1, ...

  3. 工厂模式之简单工厂模式,head first设计模式

    简单设计模式比较简单,15分钟的时间,跟着我做,十几分钟学会简单设计模式,开始吧: 1.使用new实例化一个对象时,你肯定知道这种代码缺少弹性,绑定着具体的类会导致代码更加脆弱,简单工厂模式就是针对接 ...

  4. Hyperledger Fabric2.3环境搭建

    采用Ubuntu系统下搭建 HyperledgerFabric2.3 环境 安装GoLang 下载golang安装包 https://studygolang.com/dl 下载完成后解压,移到/usr ...

  5. 1.6.3- HTML有序列表 ol元素

    代码如下: 浏览器打开: 总结:

  6. ubuntu 缺少动态依赖库

    起因 困扰我好久的一个报错,终于解决了 之前我一直以为是 python代码的问题,以为是模块相互调引起的报错,忽略了最后一行这个错误 OSError: libGCBase_gcc421_v3_0.so ...

  7. 关于Snowflake 生成53位ID

    1, bug现象: 没有经过处理的Snowflake 生成的是64位bit的唯一ID,但由于多数时候我们前台用到js,但是js只支持53位bit的数值.这样就导致了传到前台的64位的丢失精度. 解决思 ...

  8. 不可不知的CSS小技巧

    一.表单部分 1.禁止textarea文本域的缩放 resize:none; 2.去除初始化textarea下拉条 overflow:auto; 3.如何让表单中的选项按钮,点击文字也能选中? < ...

  9. 【JavaWeb】 Cookie和Session

    Session和Cookie出现的原因: 由于Http是无状态的协议,会话之间没有任何关联,也就是上一次会话和下一次会话没有任何关联,因此出现了会话技术Cookie和Session 下面分别从Cook ...

  10. 【Feign/Ribbon】记录一次生产上的SpringCloudFeign的重试问题

    在上周在的微供有数项目中(数据产品),需要对接企业微信中第三方应用,在使用Feign的去调用微服务的用户模块用微信的code获取access_token以及用户工厂信息时出现Feign重试超时报错的情 ...