<LeetCode天梯>Day011 移动零(传统法+双指针法) | 初级算法 | Python

以下为我的天梯积分规则:


每日至少一题:一题积分+10分

若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)

若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)


初始分为100分

若差一天没做题,则扣积分-10分(周六、周日除外注:休息)

坚持!!!


初级算法

刷题目录

数组

<LeetCode天梯>Day011 移动零(传统法+双指针法) | 初级算法 | Python

题干

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


示例:


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

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


说明:


必须在原数组上操作,不能拷贝额外的数组。

尽量减少操作次数。

删除+末尾候补法一

分析:


题干很简单,我们只需要在原数组上进行操作即可,越简单越好,减少操作的次数,才能做到最优化。

所以,我们先检索0的个数,然后将0移到末尾去,非零保持相对位置。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        if zero > 0:
                    for i in range(zero):
                        nums.remove(0) 
                    nums.extend([0]*zero)

(⊙o⊙)…

<LeetCode天梯>Day011 移动零(传统法+双指针法) | 初级算法 | Python

感觉效果好像不是那么的好

<LeetCode天梯>Day011 移动零(传统法+双指针法) | 初级算法 | Python

<LeetCode天梯>Day011 移动零(传统法+双指针法) | 初级算法 | Python

删除+末尾候补法二

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        zero = 0
                for i in range(n):
                    if nums[zero] == 0:
                        nums.pop(zero)  # 删除所在索引位的数值
                        nums.append(0)  # 末尾添0
        
                    else:
                        zero += 1

今天实验室网有点差,不知道是不是这个原因,导致效果不怎么好,但是不应该的呀,哎

<LeetCode天梯>Day011 移动零(传统法+双指针法) | 初级算法 | Python

<LeetCode天梯>Day011 移动零(传统法+双指针法) | 初级算法 | Python

双指针法

那砸门再搞搞优化一下


咱们用经典双指针来实现循环交换移动位置,快指针和慢指针


使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。


右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。


注意到以下性质:


左指针左边均为非零数;

右指针左边直到左指针处均为零

因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。


<LeetCode天梯>Day011 移动零(传统法+双指针法) | 初级算法 | Python

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

就很TM的离谱!!!

<LeetCode天梯>Day011 移动零(传统法+双指针法) | 初级算法 | Python

<LeetCode天梯>Day011 移动零(传统法+双指针法) | 初级算法 | Python

离谱,不过速度上去了

上一篇:[实变函数]2.2 聚点 (cluster point), 内点 (interior point), 界点 (boundary point)


下一篇:【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )