题目描述
思路解析动画文字版
记住这句「小的换分、大的换能量、能买就买买不动就卖」,下面每一帧都在套它。答案 ans 只升不随 score 回落,记的是历史峰值。
这是发到手的令牌,顺序是乱的。贪心策略要反复取「当前最小」和「当前最大」,乱序下没法一眼定位,所以第一步先排序。
排好序后,最左边的 15 是最便宜的令牌、买分优先选它;最右边的 60 是最值钱的、卖分优先选它。一头一尾正好对应两个指针。
左指针 i 指向最小令牌、负责买分,右指针 j 指向最大令牌、负责卖分。只要 i 不超过 j 就继续:先试着用 i 买,买不动再考虑用 j 卖。
先看左指针的最小令牌 15。当前能量 35 不小于它,说明买得起,那就贪心地用最便宜的把这一分先拿下。
正面朝上!花掉 15 点能量,能量从 35 降到 20,分数加到 1。这个令牌标绿,表示它被换成了分。
分数 1 创了新高,ans 刷新到 1。左指针右移,去看下一个最便宜的令牌还能不能接着买。
现在能量 20 连最小令牌 25 都买不起了。好在手里还有 1 分,可以反面朝下:盯住最值钱的 60,花 1 分把它换成一大笔能量。
反面朝下!花 1 分换来 60 点能量,能量从 20 升到 80,分数回落到 0。注意 ans 记的是历史峰值 1,卖分不会把它抹掉。右指针左移。
先看左指针的最小令牌 25。当前能量 80 不小于它,说明买得起,那就贪心地用最便宜的把这一分先拿下。
正面朝上!花掉 25 点能量,能量从 80 降到 55,分数加到 1。这个令牌标绿,表示它被换成了分。
分数 1 没超过历史最高 1,ans 保持不动。左指针右移,继续往下看。
先看左指针的最小令牌 30。当前能量 55 不小于它,说明买得起,那就贪心地用最便宜的把这一分先拿下。
正面朝上!花掉 30 点能量,能量从 55 降到 25,分数加到 2。这个令牌标绿,表示它被换成了分。
分数 2 创了新高,ans 刷新到 2。左指针右移,去看下一个最便宜的令牌还能不能接着买。
现在能量 25 连最小令牌 40 都买不起了。好在手里还有 2 分,可以反面朝下:盯住最值钱的 50,花 1 分把它换成一大笔能量。
反面朝下!花 1 分换来 50 点能量,能量从 25 升到 75,分数回落到 1。注意 ans 记的是历史峰值 2,卖分不会把它抹掉。右指针左移。
先看左指针的最小令牌 40。当前能量 75 不小于它,说明买得起,那就贪心地用最便宜的把这一分先拿下。
正面朝上!花掉 40 点能量,能量从 75 降到 35,分数加到 2。这个令牌标绿,表示它被换成了分。
分数 2 没超过历史最高 2,ans 保持不动。左指针右移,继续往下看。
左右指针交错,i 已经超过 j,可用的令牌都处理完了。绿色是买分用掉的、灰色是卖能量用掉的,过程到此为止。
回看整场:score 升到 2 时是最辉煌的一刻,后面虽然为换能量又卖回到 1,但 ans 早把这个峰值 2 记下了。所以最终答案就是 2。
边界先想清:空数组、开局就卡死、能量大到全买,三种极端心里有数。
面试重点:会用交换论证说清贪心的正确性,并讲清何时该停。
参考代码
from __future__ import annotationsfrom typing import *from collections import *from functools import *from itertools import *from math import *from heapq import *from bisect import *class Solution: def bagOfTokensScore(self, tokens: List[int], power: int) -> int: tokens.sort() ans = score = 0 i, j = 0, len(tokens) - 1 while i <= j: if power >= tokens[i]: power -= tokens[i] score, i = score + 1, i + 1 ans = max(ans, score) elif score: power += tokens[j] score, j = score - 1, j - 1 else: break return ans复杂度
- 时间:O(n log n),排序主导;之后双指针一遍线性扫
- 空间:O(1),只用几个变量;不计排序自身开销
易错点
面试追问把动画讲成自己的话
追问怎么证明「买最小、卖最大」这个贪心是对的?
追问什么时候应该停止卖分?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
煎饼排序
LeetCode 969 · 中等 · 沿着 双指针套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题