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

举报
府学路18号车神 发表于 2022/04/11 15:24:54 2022/04/11
【摘要】 工作日,周五,实验室线路改造装修,终于搞到完了,疫情依旧反复,大家带好口罩啊~ 继续继续,来,今天和车神哥一起来提升自己的Python编程和面试能力吧,刷天梯~送个镇楼图,丫丫惊~~以下为我的天梯积分规则:每日至少一题:一题积分+10分 若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;...

工作日,周五,实验室线路改造装修,终于搞到完了,疫情依旧反复,大家带好口罩啊~ 继续继续,来,今天和车神哥一起来提升自己的Python编程和面试能力吧,刷天梯~

送个镇楼图,丫丫惊~~

在这里插入图片描述
在这里插入图片描述

以下为我的天梯积分规则

每日至少一题:一题积分+10分
若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)
若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60


初始分为100分
若差一天没做题,则扣积分-10分(周六、周日除外注:休息
坚持!!!


初级算法

刷题目录

数组

在这里插入图片描述

题干

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

示例:

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

说明

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

删除+末尾候补法一

分析:

题干很简单,我们只需要在原数组上进行操作即可,越简单越好,减少操作的次数,才能做到最优化。
所以,我们先检索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⊙)…

在这里插入图片描述
感觉效果好像不是那么的好

在这里插入图片描述
在这里插入图片描述

删除+末尾候补法二

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

今天实验室网有点差,不知道是不是这个原因,导致效果不怎么好,但是不应该的呀,哎
在这里插入图片描述
在这里插入图片描述

双指针法

那砸门再搞搞优化一下

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

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

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

注意到以下性质:

  1. 左指针左边均为非零数;
  2. 右指针左边直到左指针处均为零

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

在这里插入图片描述

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的离谱!!!
在这里插入图片描述

在这里插入图片描述

离谱,不过速度上去了

Reference

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/move-zeroes/solution/yi-dong-ling-by-leetcode-solution/
来源:力扣(LeetCode)


今日得分:+10+10+10
总得分:270

加油!!!

❤坚持读Paper,坚持做笔记,坚持学习,坚持刷力扣LeetCode❤!!!
坚持刷题!!!打天梯!!!
To Be No.1

⚡⚡


创作不易⚡,过路能❤关注收藏点个赞三连就最好不过了

ღ( ´・ᴗ・` )


时空可能不会阻隔我们,但时间一定会让我们天各一方.

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。