283. Move Zeroes

来源:互联网 发布:编程教学的app 编辑:程序博客网 时间:2024/06/17 02:35

Problem:


Solution:

题中明确说明不能创建该数组的copy,从其返回值类型void也可以看出,需要的是在原数组基础上进行操作。

Edition1:

class Solution {public:    void moveZeroes(vector<int>& nums) {        vector<int> result;        int count = 0;        int length = nums.size();        for(int i = 0;i < length;i++)        {            if(nums[i] != 0)            {                result.push_back(nums[i]);            }            else                count++;        }        while(count != 0)        {            result.push_back(0);        }        for(int i = 0;i < length;i++)        {            nums[i] = result[i];        }    }};
比较僵硬的解法,相当于构建一个数组的拷贝,在拷贝数组中对元素值进行重新排列,空间复杂度为o(n),时间复杂度为o(n)

那很显然超出了题目的内存限制,无法通过。

Edition2:

class Solution {public:    void moveZeroes(vector<int>& nums) {        int i;        int length = nums.size();        for(i = 0;i < length;i++)        {            int j = i;            while(nums[j] == 0 && j < length-1)            {                j++;            }            swap(nums[i],nums[j]);        }    }};
又想到一个不需要辅助数组的空间复杂度为o(1)的方法,即依次遍历数组中的各个元素,遇到‘0’元素就与它后面的最近的非零元素交换位置,符合题目要求,时间复杂度为o(n^2)



0 0