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

发布时间 2023-11-10 21:14:04作者: 忆象峰飞

455.分发饼干
1、优先大饼干

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()
        index = len(s) - 1 # 最后一块饼干
        res = 0 # 记录满足的孩子
        for i in range(len(g) - 1, -1, -1): # 遍历胃口,从后往前
            # 找出满足胃口的饼干
            if index >= 0 and s[index] >= g[i]:
                res += 1
                index -= 1
        return res

2、优先小饼干

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()
        index = 0
        for i in range(len(s)):
            if index <= len(g) - 1 and g[index] <= s[i]:
                index += 1
        return index

376. 摆动序列
1、贪心算法

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        if len(nums) < 2:
            return len(nums)
        prediff = 0
        curdiff = 0
        res = 1 # 默认最后一个元素为一个摆动
        for i in range(len(nums)-1):
            curdiff = nums[i+1] - nums[i]
            if (prediff <= 0 and curdiff > 0) or (prediff >= 0 and curdiff < 0):
                res += 1
                prediff = curdiff # 只有出现摆动时才移动 prediff
        return res

2、动态规划

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        if len(nums) < 2:
            return len(nums)
        up = down = 1
        for i in range(1, len(nums)):
            if nums[i] > nums[i-1]:
                up = down + 1
            if nums[i] < nums[i-1]:
                down = up + 1
        return max(up, down)

53. 最大子序和

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n = len(nums)
        count = 0
        res = float("-inf")
        for i in range(n):
            count += nums[i]
            if count > res:
                res = count
            if count < 0:
                count = 0
        return res