文章目录
- 前言
- 860.柠檬水找零
- 思路
- 方法一
 
- 406.根据身高重建队列
- 思路
- 方法一
 
- 452. 用最少数量的箭引爆气球
- 思路
- 方法一
 
- 总结
前言
860.柠檬水找零

思路
很简单,贪心只有一个,如果20优先用10+5找零,因为5更加万能一些
方法一
class Solution(object):
    def lemonadeChange(self, bills):
        """
        :type bills: List[int]
        :rtype: bool
        """
        fives, tens = 0,0
        if fives:
            print("fives")
        for i in range(len(bills)):
            print(fives,tens)
            if bills[i] == 5:
                fives += 1
            elif bills[i] == 10:
                tens += 1
                if fives: fives -= 1
                else: return False
            elif bills[i] == 20:
                if fives and tens:
                    fives -= 1
                    tens -= 1
                elif fives >= 3:
                    fives -= 3
                else: return False
            else: 
                return False
        return True
406.根据身高重建队列

思路
注意思想:不能两者一起考虑,只能一个一个来
 根据身高从大到小排序之后再去考虑数目的问题;【先k后h】
- 本题的突破口在于,排序好之后只需要按照k来插入 因为每个人前面一定比他高,所以可以放心地根据k值来进行插入
 
方法一
注意点今天心态有点崩溃,太晚了就没有写了
- 需要重新定义一个que而不是直接在people里面插入,因为people会因为插入长度改变的,后面的索引会出错
- python中list插入有insert,插入位置 que.insert(p[1], p)
class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
    	# 先按照h维度的身高顺序从高到低排序。确定第一个维度
        # lambda返回的是一个元组:当-x[0](维度h)相同时,再根据x[1](维度k)从小到大排序
        people.sort(key=lambda x: (-x[0], x[1]))
        que = []
	
	# 根据每个元素的第二个维度k,贪心算法,进行插入
        # people已经排序过了:同一高度时k值小的排前面。
        for p in people:
            que.insert(p[1], p)
        return que
452. 用最少数量的箭引爆气球

 边界重合也是算可以一个箭射中两个
思路
首先需要能画出下面的图;依据左边界进行排序
 两种情况讨论
- 如果i的左边界大于i-1的右边界,那么就不重叠,肯定需要result++;
- 如果i的左边界小于等于i-1的右边界,那就不需要加一,同时右边界换成min i和i-1 的小的值,这样下一个跟新的右边界比较
  

方法一
自己写的注意点
- range从1开始,因为是和i-1比较,并且result默认初始值为1。这也好理解,如果两个气球没有交集,需要多射一次;
- 第二种我也给出了不改变原数组的写法;
- 排序还可以用这个写法 points.sort(key=lambda x: x[0])
class Solution(object):
    def findMinArrowShots(self, points):
        """
        :type points: List[List[int]]
        :rtype: int
        """
        result = 1
        points = sorted(points, key=lambda x: x[0], reverse=False)
        for i in range(1, len(points)):
            if points[i][0] > points[i-1][1]: result += 1
            else:
                points[i][1] = min(points[i][1],points[i-1][1])
        return result
class Solution: # 不改变原数组
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        points.sort(key = lambda x: x[0])
        sl,sr = points[0][0],points[0][1]
        count = 1
        for i in points:
            if i[0]>sr:
                count+=1
                sl,sr = i[0],i[1]
            else:
                sl = max(sl,i[0])
                sr = min(sr,i[1])
        return count


















