解法一

思路:创建一个临时数组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};


©著作权归作者所有:来自51CTO博客作者mb5fe18fab305a5的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Python办公自动化|光速对比并提取两份Word/Excel中的不同元素
  2. 动画: 快速排序 | 如何求第 K 大元素?
  3. php获取数组中最后一个元素的方法
  4. php实现获取数组中相同/不相同的元素
  5. 为什么推荐使用for-each而不是for循环遍历元素?
  6. 同样的复杂度,为什么插入排序比冒泡排序更受欢迎?
  7. Selenium3自动化测试【12】元素定位认知
  8. 数据结构--时间复杂度与空间复杂度
  9. Jquery对选取到的元素显示指定的长度,对于的字符串用“...”显示

随机推荐

  1. 关于Android中传递数据的一些讨论
  2. Android NDK 开发教程一:安装NDK
  3. 基本架构
  4. [Google Android] Creating Your Own Spe
  5. Android(安卓)Data Binding 技术
  6. Android 编译错误::app:transformClasses
  7. OpenCV在Android平台上的应用
  8. Android外派(安卓外派) — 长年提供安卓开
  9. android 用到的技巧集
  10. Android lint 删除无用图片文件和配置文