LeetCode 283.移动零

题目描述

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

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

示例 1:

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

示例 2:

输入: nums = [0]
输出: [0]

提示:

  • 1 <= nums.length <= 10^4
  • -2^31 <= nums[i] <= 2^31 - 1

**进阶:**你能尽量减少完成的操作次数吗?

思路

笔者使用快慢指针法来解决这题。快慢指针并行,当慢指针遇到0时,慢指针停下,让快指针继续向前移动找到第一个非0元素,然后让快慢指针所指元素进行交换。当快指针移动到数组末尾的时候就已经交换完成了。

代码

C++版:

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        // 快慢指针法
        int slow=0;
        int fast=0;
        while(fast<nums.size()){
            if(nums[slow]==0){
                // 快指针移动到下一个非0元素
                while(fast<nums.size()-1 && nums[fast]==0){
                    fast++;
                }
                if(fast<=nums.size()-1 && nums[fast]!=0 && slow!=fast){
                    // 交换慢指针的0与快指针的非0元素
                    swap(nums[slow],nums[fast]);
                }
            }
            slow++;
            fast++;
            
        }

    }
};

Python版:

python 复制代码
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        slow=0
        fast=0
        while fast<len(nums):
            if nums[slow]==0:
                while fast<len(nums)-1 and nums[fast]==0:
                    fast+=1
                if fast<=len(nums)-1 and nums[fast]!=0 and slow!=fast:
                    nums[slow],nums[fast]=nums[fast],nums[slow]
            slow+=1
            fast+=1
        

需要注意的地方

1.本题思路也可以这么描述:

左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。

2.第二种解法:

记元素向左的偏移量为 offset,初始 offset = 0。每次发现元素为 0 时增加偏移量,发现元素非 0 且偏移量非 0 时偏移元素。

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int offset = 0;

        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] == 0) {
                offset++;
            } else if (offset != 0) {
                nums[i - offset] = nums[i];
                nums[i] = 0;
            }
        }
    }
};
/*
作者:Shawxing精讲算法
链接:https://leetcode.cn/problems/move-zeroes/solutions/2821184/san-chong-jie-fa-duo-yu-yan-you-pei-tu-b-1d3s/
来源:力扣(LeetCode)
*/
相关推荐
顶呱呱程序4 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒26 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~30 分钟前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
进击的六角龙1 小时前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
王哈哈^_^1 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城1 小时前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
一只爱好编程的程序猿1 小时前
Java后台生成指定路径下创建指定名称的文件
java·python·数据下载
脉牛杂德1 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz1 小时前
STL--哈希
c++·算法·哈希算法
CSUC1 小时前
【C++】父类参数有默认值时子类构造函数列表中可以省略该参数
c++