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

455.分发饼干

题目描述: 455.分发饼干.

解法

贪心
class Solution(object):
    def findContentChildren(self, g, s):
        g.sort()
        s.sort()
        i = len(g) - 1
        j = len(s) - 1
        count = 0
        while i >= 0 and j >= 0:
            if s[j] >= g[i]:
                j-=1
                count += 1
            i-=1
        return count

主要思想就是找局部最优解,什么时候才是最优,因为每个人只能拿到一块饼干,那把一块大饼干分给胃口大的人就比分给胃口小的人要合理很多,或者说一个胃口小的人吃大饼干就没有吃小饼干划算。
这两种思路分别对应:
1.优先满足大胃口
2.优先使用小饼干

376. 摆动序列

题目描述: 376. 摆动序列.

解法

贪心
class Solution(object):
    def wiggleMaxLength(self, nums):
        pre_diff = 0
        cur_diff = 0
        count = 1
        for i in range(len(nums)-1):
            cur_diff = nums[i+1] - nums[i]
            if (cur_diff > 0 and pre_diff <= 0) or (cur_diff < 0 and pre_diff >= 0):
                count += 1
                pre_diff = cur_diff
        return count

一个节点的前面的差和后面的差是异号的,那这个节点就是一个摆动节点。
首先我们要知道,判断一个节点是否是摆动的,那至少需要3个节点进行判断,即前一节点,当前节点,后一节点,那么我们就要考虑边界情况:即一个节点如何判断,两个节点如何判断。当然可以直接强行设定,一个节点是摆动节点数量就是1,两个节点时摆动节点数量就是2。当然最好通过后面的逻辑进行判断。
那么最简单的判断方法就是前一个差和后一个差是否异号了,但是也存在很多其他情况
比如:上 n平 下,这就属于只有一个摆动节点,那么我们可以使用:如果前一个是大于等于0,后一个是小于0,就可以完成对这种平的位置进行判断,但是这样的方式也有缺点,如果是上 n平 上,就会多出来两个摆动节点,那其实完全可以等到判断出这个节点是波动节点,然后再更新前一个差就好了,如果平,那么前一个差会保持不变(一直是负号),只有遇到向下的时候,才会更新一个新的前一个差。
通过这种方式就可以应对中间有异常情况的节点计算,但是还没有考虑到边界情况,因为遍历的i最多到len(nums)-2,那么如果只有一个节点,那不会发生遍历,如果只有两个节点,那么只能计算一个后一个差,但只有两个节点的话,摆动序列长应该也是2,所以可以设置一个默认的前一个差为0,这样就可以满足计算,遍历到第一个节点的时候就会增加一个波动节点,此时再加上第二个节点,就是总节点数,因为无论怎么遍历,最后一个节点都不可能遍历到,但他一定是一个波动节点,那么可以将count默认设为1,这样也可以同时满足只有一个节点的情况。

53. 最大子序和

题目描述: 53. 最大子序和.

解法

贪心
class Solution(object):
    def maxSubArray(self, nums):
        max_sum = float('-inf')
        cur_sum = 0

        for num in nums:
            cur_sum += num
            if cur_sum > max_sum:
                max_sum = cur_sum
            if cur_sum < 0:
                cur_sum = 0
        return max_sum

我们可以从少量的数字来考虑这个问题,如果只有一个数字,是-1的话,那么就不管他,如果数字是正数,那么我们就要他,那扩大到序列来看,如果一个序列的和为负数,那么我们就不要他,如果一个序列的和为正数,我们就还要他。那就可以判断当前的序列,如果当前序列为负数了,就抛弃掉,从下一个开始重新计算序列,如果是正数,那我们就保留,并跟最大的进行对比。
不过还是要考虑一些极端情况,例如都是负数,那么这时候就得设定这个最大值的初始化值是负无穷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值