每周一算:Move Zeros

leetcode上第283号问题:Move Zeros

给定一个数组nums,写一个函数,将数组中所有的0挪到数组的末尾,⽽维持其他所有非0元素的相对位置。 举例: nums = [0, 1, 0, 3, 12],函数运⾏后结果为[1, 3, 12, 0, 0]

解法一

思路:创建一个临时数组nonZeroElements,遍历nums,将nums中非0元素赋值到nonZeroElements中,而后按顺序将nonZeroElements赋值到nums上,未遍历的元素置0;

动画如下:

代码如下:

 1// 时间复杂度: O(n)
 2// 空间复杂度: O(n)
 3class Solution {
 4public:
 5    void moveZeroes(vector<int>& nums) {
 6
 7        vector<int> nonZeroElements;
 8
 9        // 将vec中所有非0元素放入nonZeroElements中
10        for(int i = 0 ; i < nums.size() ; i ++)
11            if(nums[i])
12                nonZeroElements.push_back(nums[i]);
13
14        // 将nonZeroElements中的所有元素依次放入到nums开始的位置
15        for(int i = 0 ; i < nonZeroElements.size() ; i ++)
16            nums[i] = nonZeroElements[i];
17
18        // 将nums剩余的位置放置为0
19        for(int i = nonZeroElements.size() ; i < nums.size() ; i ++)
20            nums[i] = 0;
21    }
22};

解法二

思路:设定一个临时变量k=0,遍历数组nums,将非零元素移动到nums[k]位置,同时k++,而后将【k,….nums.size()】中的元素置零。

动画如下:

代码如下:

 1// 原地(in place)解决该问题
 2// 时间复杂度: O(n)
 3// 空间复杂度: O(1)
 4class Solution {
 5public:
 6    void moveZeroes(vector<int>& nums) {
 7
 8        int k = 0; // nums中, [0...k)的元素均为非0元素
 9
10        // 遍历到第i个元素后,保证[0...i]中所有非0元素
11        // 都按照顺序排列在[0...k)中
12        for(int i = 0 ; i < nums.size() ; i ++)
13            if(nums[i])
14                nums[k++] = nums[i];
15
16        // 将nums剩余的位置放置为0
17        for(int i = k ; i < nums.size() ; i ++)
18            nums[i] = 0;
19    }
20};

解法三

思路:设定一个临时变量k=0,遍历数组nums,将非零元素与之前的零元素进行交换,维护变量k的值。

动画如下:

代码如下:

 1// 原地(in place)解决该问题
 2// 时间复杂度: O(n)
 3// 空间复杂度: O(1)
 4class Solution {
 5public:
 6    void moveZeroes(vector<int>& nums) {
 7
 8        int k = 0; // nums中, [0...k)的元素均为非0元素
 9
10        // 遍历到第i个元素后,保证[0...i]中所有非0元素
11        // 都按照顺序排列在[0...k)中
12        // 同时, [k...i] 为 0
13        for(int i = 0 ; i < nums.size() ; i ++)
14            if(nums[i])
15                if(k != i)
16                    swap(nums[k++] , nums[i]);
17                else
18                    k ++;
19    }
20};

原文发布于微信公众号 - 五分钟学算法(blgczzz)

原文发表时间:2018-10-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python攻城狮

数据结构与算法 - 排序与搜索排序与搜索

冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重...

1003
来自专栏瓜大三哥

Matlab基本运算3

字符串指的是1xn的字符数组。单个字符是按照unicode编码存储的,每个字符占两个字节 ? 在matlab中,只要用(‘)将需要设定的字符串括起来。 disp...

2096
来自专栏海天一树

图的深度优先搜索

图有两种最基本的搜索算法,一种是深度优先搜索,另一种是广度优先搜索。本节先介绍深度优先搜索。

852
来自专栏你不就像风一样

让你一看就懂的快速排序算法(Java)

你也许会被快速排序的文章弄得迷迷糊糊,其实大体上去看,快速排序就一步:找个数做基准数,把小于它的数移到它左边,把大于它的数移到它右边。这句话是核心。然后我们只需...

1092
来自专栏老司机的技术博客

宝宝都能学会的python编程教程6:列表(list)

上期编程题的答案如上图。 列表(list) list是一种有序的集合,可以随时添加和删除其中的元素。 当索引超出了范围时,Python会报一个IndexErr...

3566
来自专栏mathor

LeetCode164. 最大间距

 这道题用到了桶排序的思想,但是跟排序没啥关系,思路是这样的,数组中有n个元素,那么就构建n+1个桶,桶的属性有三个,最大值最小值以及是否为空。桶的下标从0...

842
来自专栏Python爬虫与算法进阶

Leetcode Solutions(一) two-sum

在map[整数]整数的序号中,可以查询到a的序号。这样就不用嵌套两个for循环了。

1384
来自专栏desperate633

Python爬虫之正则表达式入门正则表达式语法正则表达式实例ReMatch对象贪婪匹配和最小匹配

Re库是Python的标准库,主要用于字符串匹配 调用方式: import re

661
来自专栏Python

Python 操作redis有序集合(sorted set)

Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中。 如果某个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证...

5621
来自专栏老司机的技术博客

人人都能学会的python编程教程6:列表(list)

当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) - 1。如果...

42710

扫码关注云+社区

领取腾讯云代金券