Day 35 | 贪心算法04

49 阅读1分钟

860. 柠檬水找零

模拟的思路

def lemonadeChange(self, bills: List[int]) -> bool:
    num_five = 0
    num_ten = 0
    for i,b in enumerate(bills):
        if b == 5:
            num_five += 1
        else:
            # give change
            if b == 10:
                num_ten += 1
                if num_five == 0:
                    return False
                num_five -= 1
            if b == 20:
                if num_ten > 0:
                    num_ten -= 1
                else:
                    if num_five < 3:
                        return False
                    num_five -= 2
                if num_five == 0:
                    return False
                num_five -= 1
    return True

406. 根据身高重建队列

先预排序列,在身高从大到小的前提下,可以直接利用第二个值作为插入的下标,因为前面的身高一定大于等于自身

def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
    # 0位置升序 1位置升序
    # 身高从大到小排 基础上 下标从小到大排
    pp = sorted(people, key=lambda x: (-x[0],x[1]))
    res = []
    for p in pp:
        if res == []:
            res.append(p)
        else:
            res.insert(p[1], p)
    return res

452. 用最少数量的箭引爆气球

注意边界条件

通过更改范围内的值n[-1]=i[1],便于后续判断,这一步是关键

def findMinArrowShots(self, points: List[List[int]]) -> int:
    n = []
    # 求最少的能同时在数组范围内的
    points.sort()
    for i in points:
        if n == []:
            n.append(i[1])
        else:
            if i[0] <= n[-1] <= i[1]:
                continue
            elif n[-1] > i[1]:
                n[-1] = i[1]
            else:
                n.append(i[1])

    return len(n)