leetcode 打卡 day35

● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

860. 柠檬水找零

有如下三种情况:
情况一:账单是5,直接收下。
情况二:账单是10,消耗一个5,增加一个10
情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5
情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。而情况三逻辑也不复杂甚至感觉纯模拟就可以了,其实情况三这里是有贪心的。
账单是20的情况,为什么要优先消耗一个10和一个5呢?因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。局部最优可以推出全局最优,并找不出反例,那么就试试贪心算法!

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

406.根据身高重建队列

本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。
如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。
那么按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。此时我们可以确定一个维度了,就是身高,前面的节点一定都比本节点高!那么只需要按照k为下标重新插入队列就可以了
Python List insert()方法:
insert() 函数用于将指定对象插入列表的指定位置。

list.insert(index, obj)

实例:

#!/usr/bin/python
 aList = [123, 'xyz', 'zara', 'abc']
 aList.insert( 3, 2009)
 print "Final List : ", aList
Final List : [123, 'xyz', 'zara', 2009, 'abc']
class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people.sort(key=lambda x: (-x[0], x[1]))
        queue = []
        for person in people:
            queue.insert(person[1], person)
        return queue

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

这是一道重叠区间的题目
为了让气球尽可能的重叠,需要对数组进行排序。
如果气球重叠了,重叠气球中右边边界的最小值之前的区间一定需要一个弓箭。
局部最优:尽可能多的气球出现重叠,一起射,所用弓箭最少

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if len(points) == 0: return 0
        points.sort(key=lambda x: x[0])
        res = 1
        for i in range(1, len(points)):
            if points[i-1][1] < points[i][0]:
                res += 1
            else:
                points[i][1] = min(points[i-1][1], points[i][1])
        return res

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