每周一算:Move Zeros

leetcode上第283号问题:Move Zeros

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

每周一算:Move Zeros

解法一

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

动画如下:

每周一算:Move Zeros

代码如下:

 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};


每周一算:Move Zeros

解法二


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

动画如下:

每周一算:Move Zeros

代码如下:

 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};


每周一算:Move Zeros

解法三


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

动画如下:

每周一算:Move Zeros

代码如下:


 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};






本文由 程序员小吴 创作,采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在先添加作者公众号二维码。
五分钟学算法 » 每周一算:Move Zeros

我还会在以下平台发布内容

GitHub 哔哩哔哩