Leetcode 周賽 203 題解

2021-10-23 17:20:05 字數 2950 閱讀 5512

雖然直接模擬是乙個辦法,但是實際上兜了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。題目初看有點麻煩,但實際上隔著特定週期 即重複長度...