算法刷题打卡030 | 贪心算法4

LeetCode 860.柠檬水找零

题目链接:860. 柠檬水找零 - 力扣(Leetcode)

这道找零问题其实很简单,贪心在于收到20的钞票时优先用一张10和一张5找零,没有10的情况下才用3张5,因为5可以给10和20找零,而10只能用于给20找零,并且这个判断逻辑的前提是按bills的顺序进行。用比较简单的if-else模拟这个过程:

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        money = {5:0, 10:0, 20:0}
        for bill in bills:
            if bill == 5:
                money[5] += 1
            elif bill == 10:
                if money[5] < 1:
                    return False
                else:
                    money[5] -= 1
                    money[10] += 1
            elif bill == 20:
                if (money[5]>=1 and money[10]>=1):
                    money[5] -= 1
                    money[10] -= 1
                    money[20] += 1
                elif money[5] >= 3:
                    money[5] -= 3
                    money[20] += 1
                else:
                    return False
        return True

LeetCode 406.根据身高重建队列

题目链接:406. 根据身高重建队列 - 力扣(Leetcode)

这一题乍一看没什么思路,看题解去了~

涉及到两个维度,需要一个个解决,先按身高排序,从大到小排(身高相同的话则k小的站前面),“按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。”具体实现简单得超乎想象:

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        # 排序
        people.sort(key=lambda x: (-x[0], x[1]))
        # 按ki插入到res
        res = []
        for p in people:
            res.insert(p[1], p)
        return res

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

题目链接:452. 用最少数量的箭引爆气球 - 力扣(Leetcode)

 这道题涉及重叠区间,首先会想到排序,贪心地让一支箭射到的气球尽可能多,具体是在遍历过程中,以第一个的右边界为参考,只要后续的气球区间左端点<=这个右边界就在这支箭的射程范围内,同时还要更新这个右边界,取最小值:

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        # 排序
        points.sort(key=lambda x: (x[0], x[1]))
        # 包含最靠左气球end的区间可以用同一支箭(start < first end)
        i = 0
        n = len(points)
        ans = 0
        while i < n:
            left_end = points[i][1]
            j = i + 1
            while j < n and points[j][0] <= left_end:
                left_end = min(left_end, points[j][1])  # 注意需要更新end,遍历过程中points[j][1]可能小于当前left_end
                j += 1
            ans += 1
            i = j
        return ans

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