雖然直接模擬是乙個辦法,但是實際上兜了n圈之後最後多出來的部分就是所求
即:1→3→2→4 等效於 1→4
class
solution
:def
mostvisited
(self, n:
int, rounds: list[
int])-
> list[
int]
: s, e = rounds[0]
, rounds[-1
]if s <= e:
# [起點, 終點]
return
list
(range
(s, e +1)
)else
:# [1, 終點]+[起點, n]
return
list
(range(1
, e +1)
)+list
(range
(s, n +1)
)
貪心,排序後令a拿最多的一堆,自己拿第二多的,b拿最少的。
所以做法就是排序
class
solution
:def
maxcoins
(self, piles: list[
int])-
>
int:
piles.sort(
) res=
0while piles:
piles.pop(
) res+=piles.pop(
) piles.pop(0)
''' 這裡應該用其他方法降低pop(0),比如計數器,但是比賽的時候還是寫的快不就完事了(
'''return res
這題一開始想的是二分查詢,但是會遇到(沒有m個)(有m個)(沒有m個)的情形,所以不行
所以做法是維護區間左右端點。
class
solution
:def
findlateststep
(self, arr: list[
int]
, m:
int)
->
int:
lr =
cnt = collections.defaultdict(
int)
latest =-1
for i,c in
enumerate
(arr)
: l = c if c not
in lr else lr[c]
''' 找左端點
'''r = c+
1if c+
1not
in lr else lr[c+1]
''' 找右端點
'''cnt[r-l]+=1
cnt[r-c-1]
-=1cnt[c-l]-=1
lr[l]
=r lr[r]
=l if cnt[m]
>0:
latest = i+
1return latest
區間dp,狀態轉移方程為:
dp(i,j) 表示左右端點為i,j時,能獲得的最大得分
=(i,k)區間和較小時:dp(i,k)+sum(i,k)【sum(i,k)表示i到k的區間和】
=(k,j)區間和較小時:dp(k,j)+sum(k,j)
=和相等時:max(dp(i,k),dp(k,j))+sum(k,j)
上述三者最大值,k取值為[i+1,j-1]
基本情況為:
dp(i,i+1)=dp(i,i)=0
所以很容易寫出超時**:
利用字首和陣列以後很容易ac:
class
solution
:def
stonegamev
(self, stonevalue: list[
int])-
>
int:
sums=[0
]for ni in stonevalue:-1
])@lru_cache(
none
)def
helper
(left,right)
:if right-
1==left or left==right:
return
0 res=
0 l,r=sums[left]
,sums[right]
for k in
range
(left+
1,right)
: ks=sums[k]
if ks-l
res=
max(res,ks-l+helper(left,k)
)elif ks-l>r-ks:
res=
max(res,r-ks+helper(k,right)
)else
: res=
max(res,ks-l +
max(helper(left,k)
,helper(k,right)))
return res
return helper(0,
len(stonevalue)
)
LeetCode 第203場周賽題解報告
知識點 計數 排序 因為資料量較小,可以直接暴力統計經過每個扇區的次數。然後選取此時最大的扇區即可。資料量較大時,可用線段樹等區間查詢技術來優化 class solution cnt rounds 0 因為只有round 0 的起點需要計數,所以單獨統計一下。知識點 貪心 排序因為每輪選擇中,bob...
LeetCode 第 203 場周賽
1560.圓形賽道上經過次數最多的扇區 class solution else 起點大於終點的情況 1561.查詢大小為 m 的最新分組 1563.石子遊戲 v 記憶搜尋 dfs dp 1 n 就是答案 終止條件 l r,return 0 狀態轉移 遍歷 l,r 中的中間點節點,根據劃分sum i ...
LeetCode周賽 204 題解
給定正整數陣列arr,請你找出乙個長度為m且在陣列中至少重複k次的模式。模式是由乙個或多個值組成的子陣列 連續的子串行 連續重複多次但不重疊。模式由其長度和重複次數定義。如果陣列中存在至少重複k次且長度為m的模式,則返回true,否則返回false。題目初看有點麻煩,但實際上隔著特定週期 即重複長度...