代码随想录算法训练营day29| 134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据身高重建队列

学习资料:https://programmercarl.com/0134.加油站.html#算法公开课

贪心:当有两个维度要考虑时,要分开考虑

134.加油站(每个位置都求净加油量;当累计的净加油量变成负数时,就舍弃前面遍历的这部分的累计净加油量,并继续向后遍历;取负数后面的那个位置作为预设的起点;另外,再求一个所有位置的净加油量的总和,若为负数,则不可能开完往返)

点击查看代码
class Solution(object):
    def canCompleteCircuit(self, gas, cost):
        """
        :type gas: List[int]
        :type cost: List[int]
        :rtype: int
        """
        # 贪心:每个点计算净加油量,逐步求和,若找到净加油量为负数的位置就清空前面,从下一位开始重新遍历
        curSum = 0
        totalSum = 0
        start = 0
        for i in range(len(gas)):
            curSum += gas[i]-cost[i]
            totalSum += gas[i]-cost[i]
            if curSum<0:
                start = i+1
                curSum = 0
        if totalSum < 0:   # 如果整体而言,净加油量为负数,那跑不完全程来回
            return -1
        else:
            return start
        

135.分发糖果(先给每个小孩分一块糖,再分两次考虑,1:从前到后(第二个数开始),可通过前数+1的操作来保证前数<=该数;2:从后往前(倒数第二个数开始),可通过与后数+1比较的方式,来保证该值>=后数)

点击查看代码
class Solution(object):
    def candy(self, ratings):
        """
        :type ratings: List[int]
        :rtype: int
        """
        # 贪心:分两次讨论
        candyResult = [1]*len(ratings)  # 先默认每个小孩得到一颗糖
        # 正序讨论,i与i-1的分数(数与左数),若i高则i的值是i-1的值加一
        for i in range(1, len(ratings)):
            if ratings[i]>ratings[i-1]:
                candyResult[i] = candyResult[i-1]+1
        # 倒序讨论,i与i+1的关系(数与左数),若i高,则i的值是max(i+1值,本身i的值)
        for i in range(len(ratings)-2, -1, -1):
            if ratings[i+1]<ratings[i]:
                candyResult[i] = max(candyResult[i], candyResult[i+1]+1)
        
        result = sum(candyResult)
        return result


        

860.柠檬水找零(理解获得三种钞票对应的各种钞票数量的增减;贪心:对于20元的,优先考虑(20元+1,10元-1,5元-1),后考虑(20元+1,5元-3)的情况,因为5元更通用想留住)

点击查看代码
class Solution(object):
    def lemonadeChange(self, bills):
        """
        :type bills: List[int]
        :rtype: bool
        """
        # 贪心:三块模板,当付5元,包里就多了一个5元;当付10元,包里多了10,少了5;当付20元有优先级的两种情况,1包里多了20,少了一个10一个5,情况2,少了3个5
        five = 0
        ten = 0
        twenty = 0
        for bill in bills:
            if bill == 5:
                five += 1
            if bill == 10:
                if five:
                    ten += 1
                    five -= 1
                else:
                    return False
            if bill == 20:
                if ten and five:
                    twenty += 1
                    ten -= 1
                    five -= 1
                elif five >= 3:
                    twenty += 1
                    five -= 3
                else:
                    return False
        return True
        

406.根据身高重建队列(理解题意难爆了,两种维度分开考虑,1优先考虑身高从高到低,其次k值从小到大;2考虑K值,新建二维数组,根据K值将原始[h,k]插入到新数组的第K个位置)

点击查看代码
class Solution(object):
    def reconstructQueue(self, people):
        """
        :type people: List[List[int]]
        :rtype: List[List[int]]
        """
        # 贪心,当要考虑两个维度(高度和数量K)时,要分开考虑
        # 1 高度:先给数组排序,按高度从大到小排;如果遇到一样高的,根据数值K排序,K由小到大
        people.sort(key=lambda x:(-x[0], x[1]))
        # 2 k值:给新二维数组插入值,根据每个[h,k]中的k,将该元素插入到新数组的第k个位置
        queue = []
        for p in people:
            queue.insert(p[1], p)  # (插入位置,插入值)
        return queue
        

PS:今天好累,朝阳很美,跟昨晚夕阳一样。
随便吃了点还不错,毕业季果然杂事多,不过也意味着毕业又近了一步

posted @   Tristan241001  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示