代码随想录算法训练营第34天| 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

  • 今日学习的文章链接,或者视频链接

第八章 贪心算法 part04

  • 自己看到题目的第一想法

  • 看完代码随想录之后的想法

860:

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        five_count = 0
        ten_count = 0

        for bill in bills:
            if bill == 5:
                five_count += 1
            elif bill == 10:
                if five_count >= 1:
                    five_count -= 1
                    ten_count += 1
                else:
                    return False
            elif bill == 20:
                if ten_count >= 1 and five_count >= 1:
                    ten_count -= 1
                    five_count -= 1
                elif five_count >= 3:
                    five_count -= 3
                else:
                    return False

        return True

406:

代码随想录算法训练营第34天| 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球_第1张图片

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:

代码随想录算法训练营第34天| 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球_第2张图片

 

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
        

 

  • 自己实现过程中遇到哪些困难

  • 今日收获,记录一下自己的学习时长

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