代码随想录算法训练营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:今天好累,朝阳很美,跟昨晚夕阳一样。
随便吃了点还不错,毕业季果然杂事多,不过也意味着毕业又近了一步
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构