• 【LeetCode-数组】移动零


    题目描述

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

    输入: [0,1,0,3,12]
    输出: [1,3,12,0,0]
    

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

    思路1

    使用双指针 p1, p2. p1 指向数组中为 0 的元素,p2 指向数据中不为 0 的元素。初始时,p1 指向数组中第一个为 0 的元素,p2 指向数组中第一个不为 0 的元素,步骤如下:

    • 当 p1 小于数组长度并且 p2 小于数组长度时,循环:
      • 如果 p1 < p2: 交换 nums[p1] 和 nums[p2];(防止数组是 [1, 2, 0] 或者 [1, 0, 1] 的情况)
      • 否则,将 p2 更新为 p2+1;
      • 将 p1 更新为下一个 0 元素的位置,将 p2 更新为下一个非 0 元素的位置;

    代码如下:

    class Solution {
    public:
        void moveZeroes(vector<int>& nums) {
            if(nums.empty()) return;
    
            int p1 = 0, p2 = 0; // p1指向零元素,p2指向非零元素
            while(p1<nums.size() && nums[p1]!=0) p1++;  // p1初始化
            while(p2<nums.size() && nums[p2]==0) p2++;  // p2初始化
    
            while(p1<nums.size() && p2<nums.size()){
                if(p1<p2){
                    swap(nums[p1], nums[p2]);
                }else p2++;
                while(p1<nums.size() && nums[p1]!=0) p1++;
                while(p2<nums.size() && nums[p2]==0) p2++;
            }
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(1)

    思路2

    还是使用双指针法,这次设置一个快指针 i,一个慢指针 j,i,j 都初始化为 0 。步骤如下:

    • i 遍历整个数组:
      • 如果 nums[i]!=0:
        • 交换 nums[i], nums[j];将 j 更新为 j+1;

    代码如下:

    class Solution {
    public:
        void moveZeroes(vector<int>& nums) {
            if(nums.empty()) return;
    
            int j = 0;
            for(int i=0; i<nums.size(); i++){
                if(nums[i]!=0){
                    swap(nums[i], nums[j]);
                    j++;
                }
            }
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(1)
  • 相关阅读:
    CF Round #427 (Div. 2) C. Star sky [dp]
    顺时针打印矩阵
    堆 栈-相关知识【转】
    二叉树的镜像
    树的子结构
    合并两个排序的链表
    数值的整数次方
    位运算:二进制中1的个数
    斐波那契数列及其变形
    重建二叉树
  • 原文地址:https://www.cnblogs.com/flix/p/12869600.html
Copyright © 2020-2023  润新知