算法随想录第三十五天打卡| 860.柠檬水找零 ,406.根据身高重建队列, 452. 用最少数量的箭引爆气球

860.柠檬水找零 

本题看上好像挺难,其实挺简单的,大家先尝试自己做一做。

代码随想录

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        nums=[0]*2  #代表5,10两种数值的钞票的数量
        for i in range(len(bills)):
            if bills[i]==5:
                nums[0]+=1
            elif bills[i]==10:
                if nums[0]>0:
                    nums[0]-=1
                    nums[1]+=1
                else:
                    return False
            else:
                if nums[1]>0 and nums[0]>0:
                    nums[1]-=1
                    nums[0]-=1
                elif nums[0]>=3:
                    nums[0]-=3
                else:
                    return False
        return True

思路

确实简单的很简单,难的又很难。这道题只要手上一有更大的钞票就用出去,感觉跟贪心没什么联系,更看的是逻辑能力吧。

406.根据身高重建队列 

本题有点难度,和分发糖果类似,不要两头兼顾,处理好一边再处理另一边。 

代码随想录

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people.sort(key=lambda x: (-x[0], x[1]))
        que=[]
        for i in people:
            que.insert(i[1],i)
        return que 

总结

想到先排序,但不知道接下来该怎么做了。答案使用了元组,我还不知道有这种用法:当第一个相等时,比较第二个的大小。加了个负号,表示从大到小排列,x[0]表示元素的0下标,不是列表的0下标。insert()函数可以在指定的下标下面添加目标值。

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

本题是一道 重叠区间的题目,好好做一做,因为明天三道题目,都是 重叠区间。 

代码随想录

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if len(points)==1:
            return 1
        result=1
        points.sort(key=lambda x:(x[0]))
        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

总结

感觉理解了,有重叠的话要确定右边最小值作为切割点,以免出现下一个依旧重叠却切不到的情况。但感觉又有些没有理解,再看看其他的重叠的题吧。

你可能感兴趣的:(算法,leetcode,职场和发展)