2024-01-02 柠檬水和用最少数量的箭引爆气球

860. 柠檬水找零

思路:贪心想法优先消耗10元,5元是万能的!
class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        if bills[0] > 5:
            return False
        five_money = 0
        tem_money = 0
        for bill_ in bills:
            if bill_ == 5:
                five_money += 1
            elif bill_ == 10:
                if five_money >= 1:
                    five_money -= 1
                    tem_money += 1
                else:
                    return False
            elif bill_ == 20:
                if five_money >= 1 and tem_money >= 1:
                    five_money -= 1
                    tem_money -= 1
                elif five_money >= 3:
                    five_money -= 3
                else:
                    return False
        return True

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

思路:依旧先排好序!局部优先,当气球重叠在一起的时候,发射的箭最少 全局最优就是:把所有气球射爆所用的弓箭最少

2024-01-02 柠檬水和用最少数量的箭引爆气球_第1张图片

2024-01-02 柠檬水和用最少数量的箭引爆气球_第2张图片

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        # 排序 从小排到大,而且只需要排一维就可以了,无序排二维的
        points.sort(key=lambda x: (x[0], -x[1]))
        total = 1
        index = 0
        # print(points)
        # 其实可以使用一个temp来接受左边的大小,进行比对更新即可
        for i in range(1, len(points)):
            if points[i][0] <= points[index][1]:
                points[index][0] = points[i][0]
                points[index][1] = min(points[i][1],points[index][1])
            else:
                total += 1
                index = i 
        return total

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if len(points) == 0: return 0
        points.sort(key=lambda x: x[0])
        result = 1
        for i in range(1, len(points)):
            if points[i][0] > points[i - 1][1]: # 气球i和气球i-1不挨着,注意这里不是>=
                result += 1     
            else:
                points[i][1] = min(points[i - 1][1], points[i][1]) # 更新重叠气球最小右边界
        return result

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