前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每周一算:Move Zeros

每周一算:Move Zeros

作者头像
五分钟学算法
发布2018-11-20 15:19:27
4130
发布2018-11-20 15:19:27
举报
文章被收录于专栏:五分钟学算法

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;

动画如下:

代码如下:

代码语言:javascript
复制
 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()】中的元素置零。

动画如下:

代码如下:

代码语言:javascript
复制
 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的值。

动画如下:

代码如下:

代码语言:javascript
复制
 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};
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档