Day 30 贪心算法 part01

Day 30 贪心算法 part01

  • 解题理解
    • 455
    • 376
    • 53

3道题目
455. 分发饼干
376. 摆动序列
53. 最大子数组和

解题理解

455

不管是暴力遍历还是一次遍历,都需要先对两个两个数组排序,然后就是选择有限分配少的还是优先分配多的,但遍历主题需要是饼干,同时在遍历过程中可以用下标表示最多可以分的人数。

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) and s[i] >= g[index]:
            	//如果遍历主体是g的话,可能会出现s[index]无法往后,不能正常计数
                index += 1
        return index

376

这题有点像双指针,只不过这里不是指针,而是两个变量,一个存当前差值,另一个存之前的差值。
整体思路都能写出来,就是最后取差值时纠结错了,写成i跟i-1去做差值,把很多情况变得复杂化。

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        if len(nums) <= 1:
            return 1

        index = 1
        dis = 0
        pre = 0
        for i in range(len(nums) - 1):
            dis = nums[i + 1] - nums[i]
            if (pre >= 0 and dis < 0) or (pre <= 0 and dis > 0):
                index += 1
                pre = dis
        return index

53

中间用到的一个巧妙思路没想出来,有点偏数学思维了。
连续最大子数组和在遍历过程中,会出现负值加进来的情况,当整体子数组和要成为负数时,就需要置0重新计算,题目不要求输出子数组,只需要和,再搭配一个maxNum时刻保存遇到的最大和,这样每次重新确定开头就可以确保扫描到的子数组和最大。

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

你可能感兴趣的:(贪心算法,算法)