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

Leetcode - 860

这题其实不难,而且可以尽可能的简化。首先,我们只会受到三种钱,5 ,10 ,20,收到5不用找零,找到10,找5元,收到20元,找10 +5 或者 3 * 5, 需要注意的是,因为我们根本不会用20去找零,所以我们收到多少20块钱都不是不用记录,

所以我们只有记录 5 10 的数量,也不需要用列表装载,定义两个变量计数即可,收到20,就判断5的计数变量是否大于1和10的计数变量是否大于1, 或者5的计数变量是否大于3,这里注意 我们优先找10+5的组合,因为5是更通用的,满足两种情况,所以尽可能保留5

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
                five -= 1
                ten += 1
            else:
                if ten > 0 and five > 0:
                    ten -= 1
                    five -= 1
                elif five > 2:
                    five -= 3
                else:
                    return False
        return True

Leetcode - 406

这题要考虑两个维度,第一是身高,第二是排位,一看到这种多维度考虑的题,就不能想着一次性把所有的都兼顾了,只能一维一维来。

首先是处理身高这个维度,因为如果对第二个维度处理,我们很难想到该怎么处理,那身高是应该什么顺序排列呢,应该从大大小排列,且碰到身高相同的,k值小的在前面。这样就造成了最大的元素都集中在了前面,这样我们再开始处理第二个维度,k值等于多少就插在第几个位置,为什么这样合理呢,因为当前元素,前面的元素一定比自己大,所以 插到指定位置后,前面的元素一定比自己大,不会存在不合理的情况,这也是为什么一开始要对身高从大到小排列的原因。

这里还有一个技巧,就是排序方法的代码,我们要定义一个类,类中的__lr__方法我们要进行重写,因为我们不仅仅是根据身高排序,碰到相同身高的还要根据k值排,

class Cmp(list):
        def __lt__(self, other):
            #当身高不等时,返回真实的身高大小关系,这里表示只有self的身高小于other的身高,self才小于other
            if self[0] != other[0]:
                return int.__lt__(self[0], other[0])
#  身高相等时,k值小的拍前面,但是因为这里我们是逆序排列的,所以这里我们符号也进行改变了
            else:
                return self[1] > other[1]

排序 插入 就完事了

class Cmp(list):
        def __lt__(self, other):
            if self[0] != other[0]:
                return int.__lt__(self[0], other[0])
            else:
                return self[1] > other[1]
class Solution:
    
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        res = []
        people.sort(key=Cmp,reverse=True)
        print(people)
        for item in people:
            res.insert(item[1],item)

        return res

Leetcode - 452

这题就是要求,一支箭要尽可能的多射几个重合区间

区间重叠有两种情况:

数值上相邻或重叠才能使我们更好的做判断,所以我们要对一个维度进行排序,使区间尽可能的相近。

这里我们对第一个维度排序,

这里直接用卡哥的图,可以看出 只有当前的区间的右边界 >= 后一个区间的左边界时,才能视作重合,若判定为重合,则继续向下判断的时候,要使用两区间的右边界的最小值判断,比如图中1-6 2-8区间,要继续往下时,只能用6,而不是8,使用8,则和下一个区间重叠了,但是下个区间并不会与1-6重合,

所以判定重合时,边界值要更新。

我们可以用一个变量minValue来记录右边的边界。

当不等时,此时需要一个新的箭了,且将下一个元素的右边界作为新的minValue, 每来一个新箭就利用不重合那个区间的右边界来更新。

箭最少为1,所以初始化为1,且如果第一个区间出现多个重合也不会需要箭数+1

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

        return arrow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值