Leetcode 力扣第220場周賽

2021-10-12 12:26:47 字數 3609 閱讀 9092

這就開博乙個月了耶

然而然而,這個月裡只打了兩次周賽,都是五分鐘打完兩道題然後無了。

?唉。。。我好菜啊。。。

重新格式化**號碼

給你乙個字串形式的**號碼 number 。number 由數字、空格 』 '、和破折號 『-』 組成。

請你按下述方式重新格式化**號碼。

首先,刪除 所有的空格和破折號。 其次,將陣列從左到右 每 3 個一組 分塊,直到 剩下 4 個或更少數字。剩下的數字將按下述規定再分塊:

2 個數字:單個含 2 個數字的塊。 3 個數字:單個含 3 個數字的塊。 4 個數字:兩個分別含 2 個數字的塊。

最後用破折號將這些塊連線起來。注意,重新格式化過程中 不應該 生成僅含 1 個數字的塊,並且 最多 生成兩個含 2 個數字的塊。

返回格式化後的**號碼。

字串處理,寫的很醜,大概思路就是把』0123456789』作為valid列表,只有valid的字元才能夠通過,同時用乙個counter計數,滿3次加個』-』,如果最後結束的時候尾部是』-』,就刪去,如果只多乙個,就調整』-'的位置。

class

solution

:def

reformatnumber

(self, number:

str)

->

str:

num =

list

(number)

valid =

list

('0123456789'

) res =

c =0for i in num:

if i in valid:

c +=

1if c ==3:

'-')

c =0print

(res,c)

if c ==1:

res.pop(-2

) res.insert(-2

,'-'

)if c ==0:

res.pop(

) ans =

''for i in res:

ans += i

return ans

刪除子陣列的最大得分

給你乙個正整數陣列 nums ,請你從中刪除乙個含有 若干不同元素 的子陣列。刪除子陣列的 得分 就是子陣列各元素之 和 。

返回 只刪除乙個 子陣列可獲得的 最大得分 。

如果陣列 b 是陣列 a 的乙個連續子串行,即如果它等於 a[l],a[l+1],…,a[r] ,那麼它就是 a 的乙個子陣列。

一開始人傻了,這題目寫的有點tricky,其實關鍵點在於不同元素。所以就是要求最大無重複元素子數列。

思路是用乙個滑動視窗,右邊新滑進來的值,如果原來沒有出現,那麼白賺了乙個值,無事發生。如果新加入的值是已經存在的,那麼左邊的邊界就應該劃在上一次該值出現的右邊。這樣遍歷一遍整個陣列,存下每個視窗的和的最大值。

class

solution

:def

maximumuniquesubarray

(self, nums: list[

int])-

>

int:

n =len(nums)

presum =[0

]*(n+1

)for i in

range(1

,n+1):

presum[i]

= presum[i-1]

+nums[i-1]

# print(presum)

ptr_l =

0 ptr_r =

0 ptr_sum = presum[0]

while ptr_r < n:

# print(ptr_l,ptr_r,ptr_sum)

if ptr_r < n and nums[ptr_r]

in nums[ptr_l:ptr_r]

: ptr_l +=

(nums[ptr_l:ptr_r]

.index(nums[ptr_r])+

1)ptr_sum =

max(ptr_sum,presum[ptr_r+1]

-presum[ptr_l]

) ptr_r +=

1return ptr_sum

跳躍遊戲 vi

給你乙個下標從 0 開始的整數陣列 nums 和乙個整數 k 。

一開始你在下標 0 處。每一步,你最多可以往前跳 k 步,但你不能跳出陣列的邊界。也就是說,你可以從下標 i 跳到 [i + 1,

min(n - 1, i + k)] 包含 兩個端點的任意位置。

你的目標是到達陣列最後乙個位置(下標為 n - 1 ),你的 得分 為經過的所有數字之和。

請你返回你能得到的 最大得分 。

這是一道因為吃飯沒做出來的題(也許不吃飯也做不出來。

看完題解還是有點會了的!

用dp來做。

f (i

)f(i)

f(i)

表示從0

00跳到i

ii的最大得分。

那麼在i

ii後邊的j

jj的狀態轉移方程就可以寫成f(j

)=

max⁡

min⁡≤i

≤jf(

i)+n

ums[

j]

f(j) = \max\limits_\leq i\leq j} f(i) +nums[j]

f(j)

=min≤i

≤jmax​f(

i)+n

ums[

j]但是這個暴力dp會超時,所以我們每次不去遍歷j

jj前的k

kk個了,直接把這些結果用乙個堆存起來,每次pop得分最多的那個,同時檢查是否valid(是不是在距離k

kk內).

class

solution

:def

maxresult

(self, nums: list[

int]

, k:

int)

->

int:

n =len(nums)

dp =[0

]* n

dp[0]

= nums[0]

heap =

(-nums[0]

,0))

for i in

range(1

,n):

if heap:

while i - heap[0]

[1]> k:

val =

-heap[0]

[0] dp[i]

= nums[i]

+ val

(-dp[i]

,i))

# print(heap,i,k)

return dp[-1

]

力扣(leetcode)第 34 場雙周賽題解

解題思路 直接暴力,當變長是偶數是不用減最中間的數,當邊長是奇數時要減去最中間的數。比賽的時候沒想那麼多,看不大就用了各陣列標記有沒有加過。class solution return 0 public int findlengthofshortestsubarray vector arr else ...

力扣第165場周賽

a 和 b 在乙個 3 x 3 的網格上玩井字棋。井字棋遊戲的規則如下 玩家輪流將棋子放在空方格 上。第乙個玩家 a 總是用 x 作為棋子,而第二個玩家 b 總是用 o 作為棋子。x 和 o 只能放在空方格中,而不能放在已經被占用的方格上。只要有 3 個相同的 非空 棋子排成一條直線 行 列 對角線...

力扣第 202 場周賽

傳送門 5185 存在連續三個奇數的陣列 給你乙個整數陣列 arr,請你判斷陣列中是否存在連續三個元素都是奇數的情況 如果存在,請返回 true 否則,返回 false 示例 1 輸入 arr 2,6,4,1 輸出 false 解釋 不存在連續三個元素都是奇數的情況。示例 2 輸入 arr 1,2,...