【題目】
你的初始 能量 為 p,初始 分數 為 0,只有一包令牌 tokens 。其中 tokens[i] 是第 i 個令牌的值(下標從 0 開始)。
令牌可能的兩種使用方法如下:
如果你至少有 token[i] 點 能量 ,可以將令牌 i 置為正面朝上,失去 token[i] 點 能量 ,並得到 1 分 。
如果我們至少有 1 分 ,可以將令牌 i 置為反面朝上,獲得 token[i] 點 能量 ,並失去 1 分 。
每個令牌 最多 只能使用一次,使用 順序不限 ,不需 使用所有令牌。
在使用任意數量的令牌後,返回我們可以得到的最大 分數 。
【示例 1】
輸入:tokens = [100], p = 50
輸出:0
解釋:無法使用唯一的令牌,因為能量和分數都太少了。
【示例 2】
輸入:tokens = [100,200], p = 150
輸出:1
解釋:令牌 0 正面朝上,能量變為 50,分數變為 1 。不必使用令牌 1 ,因為你無法使用它來提高分數。
【示例 3】
輸入:tokens = [100,200,300,400], p = 200
輸出:2
解釋:按下面順序使用令牌可以得到 2 分:
令牌 0 正面朝上,能量變為 100 ,分數變為 1
令牌 3 正面朝下,能量變為 500 ,分數變為 0
令牌 1 正面朝上,能量變為 300 ,分數變為 1
令牌 2 正面朝上,能量變為 0 ,分數變為 2
提示0 <= tokens.length <= 1000
0 <= tokens[i], p < 104
【**】
【python】
class
solution
:def
bagoftokensscore
(self, tokens: list[
int]
, p:
int)
->
int:
tokens.sort(
)#目標:更多的分數
#1分可以換取乙個令牌的能量,將該令牌反面向上
#分數盡可能換成右側的,翻令牌得分盡可能使用左側的
cnt,maxcnt=0,
0 l,r=0,
len(tokens)-1
#特殊情況預處理流程
if l==r and p>=tokens[0]
:return
1elif tokens and p:return
0#一般情況處理流程
while lwhile p>=tokens[l]
: p-=tokens[l]
l+=1#下標+1
cnt+=
1#分數+1
#能量不夠了 退出迴圈
#用一分換取能量,先判斷是否有分數可換取
if cnt:
maxcnt=
max(maxcnt,cnt)
p+=tokens[r]
r-=1 cnt-=
1else
:break
print
(p,l,r)
return maxcnt
【方法2】
class
solution
(object):
defbagoftokensscore
(self, tokens, p)
: tokens.sort(
) deque = collections.deque(tokens)
ans = bns =
0while deque and
(p >= deque[0]
or bns)
:while deque and p >= deque[0]
: p -= deque.popleft(
) bns +=
1 ans =
max(ans, bns)
if deque and bns:
p += deque.pop(
) bns -=
1return ans
leetcode 948 令牌放置
你的初始能量為p,初始分數為0,只有一包令牌。令牌的值為token i 每個令牌最多只能使用一次,可能的兩種使用方法如下 在使用任意數量的令牌後,返回我們可以得到的最大分數。示例 1 輸入 tokens 100 p 50輸出 0示例 2 輸入 tokens 100,200 p 150輸出 1示例 3...
Leetcode 948 令牌放置
你的初始能量為p,初始分數為0,只有一包令牌。令牌的值為token i 每個令牌最多只能使用一次,可能的兩種使用方法如下 在使用任意數量的令牌後,返回我們可以得到的最大分數。示例 1 輸入 tokens 100 p 50輸出 0示例 2 輸入 tokens 100,200 p 150輸出 1示例 3...
令牌放置 leetcode948
1 本題主要依據乙個原則 能量換積分時取小能量,積分換能量時取大能量。所以需要保證陣列有序。2 先對陣列進行排序,然後雙指標分別指向陣列左右端點。3 定義積分 count表示不兌換最後一次,countchange表示兌換最後一次 能量不足時有沒有必要兌換 4 雙指標left right時迴圈brea...