Day 31 | 贪心算法

53 阅读1分钟

455. 分发饼干

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

    c, b = 0, 0
    for b in s:
        if b >= g[c]:
            num += 1
            c += 1
        else:
            continue
        if c == len(g):
            break
        
    return num

376. 摆动序列

贪心 算前后差值的乘积是否小于0

注意前后两数相等的情况

def wiggleMaxLength(self, nums: List[int]) -> int:
    minus = []
    flag = 0
    count = 1
    for i in range(1, len(nums)):
        minus = nums[i]-nums[i-1]
        if flag * minus <= 0 and minus != 0:
            count += 1
            flag = minus
    
    return count

dp解法

(待补)

53. 最大子数组和

局部最优的情况下,并记录最大的“连续和”,可以推出全局最优

其实贪心的思想,就是从局部最优扩散到全局最优

如果遇到负数,就比较累计到目前的结果是否比负数大,大就说明可以包括负数,这样的思路在遇到全负数组时会错误

设res起始值为负数,注意先取ans

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

    ans = 0
    res = -inf

    for i in range(len(nums)):
        ans += nums[i]
        # 注意判断顺序
        if ans > res:
            res = ans
        if ans <= 0:
            ans = 0                
    
    return res

分治法

(待补)