【LeetCode】283. Move Zeroes

时间:2019-01-11
本文章向大家介绍【LeetCode】283. Move Zeroes,主要包括【LeetCode】283. Move Zeroes使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.Move Zeroes

Description:
Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
Difficulty:Easy
Example:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

Note:

  • You must do this in-place without making a copy of the array.
  • Minimize the total number of operations.

方法1:空间次优

  • Time complexity : O(n)O\left ( n \right )
  • Space complexity : O(n)O\left ( n \right )
    思路
    将非零元素存储在另一个数组里,再将0填充在最后
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size();
		int num_zeroes = 0;
		vector<int> temp_vector;
		for (int i = 0; i < n; i++) {
			if (nums[i] == 0) {
				num_zeroes += 1;
			}
			else {
				temp_vector.push_back(nums[i]);
			}
		}
		while (num_zeroes--) {
			temp_vector.push_back(0);
		}
		for (int i = 0; i < n; i++) {
			nums[i] = temp_vector[i];
		}
    }
};

方法2:空间最优,操作数次优

  • Time complexity : O(n)O\left ( n \right )
  • Space complexity : O(1)O\left ( 1 \right )
    思路
    快慢指针,慢指针始终指向非零元素的后面一个位置,当快指针发现了非零元素,将非零元素赋值给慢指针,慢指针向后移一位。
    第一次遍历,将所有非零元素移到数组靠前部分;
    第二次遍历,将慢指针后面的元素置0。
    关键点
    与方法1比较,利用覆盖减少空间的使用。
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
		int last_non_zero_at = 0;
		for (int i = 0; i < nums.size(); i++) {
			if (nums[i] != 0) {
				nums[last_non_zero_at++] = nums[i];
			}
		}
		for (int i = last_non_zero_at; i < nums.size(); i++) {
			nums[i] = 0;
		}
    }
};

方法3:最优

  • Time complexity : O(n)O\left ( n \right )
  • Space complexity : O(1)O\left ( 1 \right )
    思路
    与方法2相似,但是不进行覆盖而是交换,可以尽量减少操作次数,例如[0,0,…,0.1],在方法2中0会被写很多次
    关键点
  • 保持数组有三个区域,第一部分是非零元素,第二部分是零元素,第三部分是未判断区域,慢指针指向零元素的第一个位置,快指针指向未判断区域的第一个,如果发现非零元素,快慢指针交换
  • 可以不用交换操作,但要注意边界,例如[1,1,1,1]
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
		int last_non_zero_at = 0;
		for (int i = 0; i < nums.size(); i++) {
			if (nums[i] != 0) {
				swap(nums[last_non_zero_at++], nums[i]);
			}
		}
    }
};