前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法-数组-移动零

算法-数组-移动零

作者头像
用户3578099
发布2022-06-10 15:44:20
8670
发布2022-06-10 15:44:20
举报
文章被收录于专栏:AI科技时讯AI科技时讯

283.移动零

来源:力扣(LeetCode)

链接: https://leetcode.cn/problems/move-zeroes

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

代码语言:javascript
复制
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

代码语言:javascript
复制
输入: nums = [0]
输出: [0]

提示:

  • 1 <= nums.length <= 104
  • -2^{31} <= nums[i] <=2^{31} - 1
  • 进阶:你能尽量减少完成的操作次数吗?

解法

  • 统计非0的个数:遍历一遍,统计非0元素的个数,并将非0元素往左拉;从后面开始遍历第二遍,基于长度差将末尾元素设置为0
  • 新建数组:新建全0元素,并将非0元素在前面赋值
  • 双指针:双指针,用j表示非0元素的位置,用下标i遍历数组,如果发现i下的元素非0,就将该元素赋值给j,如果i与j不相等,表明发生了挪动,此时需要将i处的元素设置为0;j++操作

代码实现

方法1 统计非0的个数

python实现

代码语言:javascript
复制
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        # 方法1 统计0的个数,非0元素往前拉,末尾补零
        """
        n = len(nums)
        j = 0
        for i in range(n):
            if nums[i]:
                nums[j] = nums[i]
                j += 1
        for i in range(j, n):
            nums[i] = 0
        return nums

c++实现

代码语言:javascript
复制
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        
        // 方法1 统计非0元素的个数,并将非零元素往左拉,并将末尾元素设置为0
        int n = nums.size();
        int j = 0;
        for(int i=0; i<n; i++)
        {
            if(nums[i] != 0)
            {
                nums[j] = nums[i];
                j++;
            }
        }
        for(int i=j; i<n; i++)
        {
            nums[i] = 0;
        }
};

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
方法2 新建数组

python实现

代码语言:javascript
复制
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        # 方法2 开新数组,非0元素放入,0元素放末尾, 方法不行,因为需要在不复制数组情况下进行原地处理
        n = len(nums)
        new_nums = [0] * n
        j = 0
        for num in nums:
            if num:
                new_nums[j] = num
                j += 1
        return new_nums

c++实现

代码语言:javascript
复制
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        // 方法2 新建全0元素,并将非0元素在前面赋值;
        int n = nums.size();
        int j = 0;
        vector <int> new_nums(n);
        for(int i=0; i<n; i++)
        {
            if(nums[i] != 0)
            {
                new_nums[j] = nums[i];
                j++;
            }
        }
        nums = new_nums;
    }
};

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

由于新建数组

方法3 双指针

python实现

代码语言:javascript
复制
import copy

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        # 方法3 直接在数组中进行index操作,用j记录非0元素的位置,并将非0元素挪动到j位置下,如果i与j不相等的话,将i置为0
        n = len(nums)
        j = 0
        for i in range(n):
            if nums[i]:
                nums[j] = nums[i]
                if i != j:
                    nums[i] = 0
                j += 1
         return nums

c++实现

代码语言:javascript
复制
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        // 方法3 双指针,用j表示非0元素的index,如果index i上的元素非0,就赋值该元素到index j下,如果i与j不相等,表明发生了移动,此时将i上的元素赋值为0
        int n = nums.size();
        int j = 0;
        for(int i=0; i<n; i++)
        {
            if(nums[i] != 0)
            {
                nums[j] = nums[i];
                if(i != j)
                {
                    nums[i] = 0;
                }
                j++;
            }
        }
    }
};

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技时讯 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 283.移动零
  • 解法
  • 代码实现
    • 方法1 统计非0的个数
      • 方法2 新建数组
        • 方法3 双指针
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档