LeetCode刷题笔记_数组类算法(python)

2 删除有序数组中的重复项

给出数组并去重,每种数保留一个。

初期思路:双层for循环,遍历出每组数,将值相同索引不同的删去,使用remove()。

问题:每次remove都会改变数组,导致索引不好确定。

转换思路:不进行删除操作,妹妹身材一样的跳过,不一样的保留,重点在不同。

代码:

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        t = 0 #t作为遍历整个数组的指针
        for i in nums:
            if t < 1 or nums[t-1] != i:
                nums[t] = i
                t = t + 1
        return t 

分析:首先 t<1必定需要保留,将第一个值放在第一个位置,t++;之后就会遇到不同的妹妹,我们的指针妹妹为t,所以要分析第t-1个妹妹与第t个妹妹是不是一种妹妹,不同的话,保留指针t的妹妹的值,t再加加;返回的t值即为妹妹的种类值。

双指针思路:指针i遍历全程,指针j指向有效数组的最后一个位置,只有当i指向的值和j指向的值不一致时,将i的值添加到j的下一个位置(实际上还是不同的问题,利用了两个不同速度指针对数组进行修改)

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        j = 0
        for i in range(n):
            if nums[i] != nums[j]:
                j = j + 1
                nums[j] = nums[i]
        return j+1

3 移除元素

给出数组和一个int数,删除数组中所有和给出数相同值的数组项,并返回修改后数组的长度

思路:很简单啦,一个for循环便利整个数组中的妹妹,与目标妹妹做个比较就行了,这里用remove()函数在每轮循环时会自动改变数组,加入数组中存在两个以上和目标妹妹长得一样的妹妹,会漏妹妹哦,注意从后往前遍历妹妹数组进入循环,好看的妹妹从后面不会漏还轻松。嘿嘿。

代码:

class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        for i in range(len(nums)-1, -1 ,-1):
            if nums[i] == val:
                nums.remove(nums[i])
        return len(nums)

这里可不可以试着用双指针来找妹妹呢?来个正面的?

因为不同就是使用双指针的关键,我们用双指针来把数组分为两个部分:不是要找的妹妹组和要找的妹妹组。

代码:

class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        n = len(nums)
        j = 0 # i负责遍历 j负责区分
        for i in range(n):
            if nums[i] != val:
                nums[j] = nums[i] # 不相等则保留
                j = j + 1
            #如果遇到相等的 j就在上一轮的位置不动了,保留下一个不相等的num[i]
        return j

心得:对于第一种方法要懂得后入,对于第二种方法要懂得:

这个妹妹走了,不要担心这个妹妹占过的位置空了怎么办,下个妹妹会很干脆的补上,用新妹妹覆盖旧妹妹,走了就是不值得,真的爱你的妹妹还在后面等你,不信?我删除2,print一下nums,看stdout!

是不是2妹妹在后面等你不离不弃?对吧 算法都这样,嘿嘿,想复杂了题就解不了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值