代码随想录算法训练营第三十一天| 455.分发饼干、376. 摆动序列 、53. 最大子序和

Leetcode - 455

先对两个序列进行排序,用两个指针,一个指向孩子序列的开头,一个指向饼干序列的开头,开始循环,若饼干指针指向的元素大于孩子指针指向的元素,res+=1,两指针各向前一步,若不满足,则饼干指针向前,直到其中一个指针指向末尾就结束循环

def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()

        i = 0
        j = 0
        res = 0
        while i < len(g) and j < len(s):
            if s[j] >= g[i]:
                res +=1
                i+=1
                j+=1
            
            else:
                j+=1

        return res

Leetcode - 376

此题是通过记录峰值来跟新结果的,一个两个元素的严格单调序列(nums[i] > nums[i-1] or nums[i] < nums[i-1])它的峰值是两个,但如果是三个元素的单调序列,那它的峰值仍然是两个,只有当第三个元素和第二个元素的大小关系 与 第二个元素和第一个元素的大小关系相反时,峰值才会+1。

峰值初始值为1,因为列表中至少一个元素,只要第二个元素大于或小于第一个元素,峰值就会+1,再往后,只有当三个元素间,呈现+ - 或 - +关系时,峰值才+1

一种在最左侧的特殊情况是,第一个元素与第二个元素相等,但是第三个元素与第二个元素不等,这里峰值仍然有两个,分别是第二和第三个元素。

在进行循环的过程中,我们的i指代的是三个元素的中间那个,当前元素和前一个元素的差值为preGap, 后一个元素和当前元素的差值为currGap, 循环到len(nums)-1时结束

满足峰值➕1的条件是 (preGap <=0 and currGap >0) or (preGap >=0 and currGap <0)

且仅仅当满足条件时,我们才将preGap跟新为currGap,因为在处于连续单调区间时,跟新preGap没有什么意义

def wiggleMaxLength(self, nums: List[int]) -> int:

        if len(nums) == 1:
            return 1

        preGap = 0
        currGap = 0
        res = 1

        for i in range(len(nums)-1):
            currGap = nums[i+1] - nums[i]

            if (preGap <=0 and currGap >0) or (preGap >=0 and currGap <0):
                res +=1

                preGap = currGap

        return res

Leetcode - 53

设置一个无限小的值作为结果res的初始值,再设定一个变量temp用于记录当前子序列和,

开始遍历序列后,temp += nums[i],然后更新res,res为自身和temp的最大值,

接着 如果此时temp <0 了, 我们直接将temp置为0,然后continue,代表子数组从下一个元素开始重新记录,这也是贪心所在,一旦小于0了,代表遇到了负数,就从下一个元素开始重新记录

 def maxSubArray(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return nums[0]

        res = -float("INF")
        
        temp = 0
        for i in range(len(nums)):
            temp += nums[i]
            res = max(res,temp)

            if temp <0:
                temp = 0

        return res

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值