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

860. 柠檬水找零

  • 第一反应是用hashmap来计数,最后来判断是否所有的值都是大于等于0。但实际上不需要这样,首先不需要收集20的个数,其次只是要计数功能的话直接定义两个变量就好。

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        if bills[0] != 5:
            return False
        
        fiveC = 0
        tenC = 0
        
        for bill in bills:
            if bill == 5:
                fiveC += 1
            elif bill == 10:
                if fiveC < 1:
                    return False
                tenC += 1
                fiveC -= 1
            else:
                if tenC > 0 and fiveC > 0:
                    tenC -= 1
                    fiveC -= 1
                elif fiveC > 2:
                    fiveC -= 3
                else:
                    return False
            print('# of 5 is',fiveC)
            print(tenC)
        return True

406.根据身高重建队列

  • 没什么思路,连题目都没理解,搜了讲解才懂

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people.sort(key=lambda x: (-x[0], x[1]))
        '''
        lambda x: (-x[0], x[1])
        理解:
        1.首先x是一个变量,这里是指people里的元素,本题是里面的list
        2.(x[0], x[1])意思是首先按照里面的么每个list的x[0](第一个元素)来排序,如果相等那么再按照x[1]来排序
        3.在x[0]前面加一个 负号,意思是降序排列
        '''
        print(people)
        ans = []
        
        for p in people:
            ans.insert(p[1], p)
            print('current ans is', ans)
        return ans

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

  • 没思路

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

你可能感兴趣的:(python,算法,数据结构,leetcode)