Leetcode第134場周賽題目學習

2021-09-20 21:55:17 字數 4383 閱讀 9631

三枚石子放置在數軸上,位置分別為abc

每一回合,我們假設這三枚石子當前分別位於位置x, y, zx < y < z。從位置x或者是位置z拿起一枚石子,並將該石子移動到某一整數字置k處,其中x < k < zk != y

當你無法進行任何移動時,即,這些石子的位置連續時,遊戲結束。

要使遊戲結束,你可以執行的最小和最大移動次數分別是多少? 以長度為 2 的陣列形式返回答案:answer = [minimum_moves, maximum_moves]

示例1:

輸入:a = 1, b = 2, c = 5

輸出:[1, 2]

解釋:將石子從 5 移動到 4 再移動到 3,或者我們可以直接將石子移動到 3。

示例2:

輸入:a = 4, b = 3, c = 2

輸出:[0, 0]

解釋:我們無法進行任何移動。

1 <= a <= 1001 <= b <= 1001 <= c <= 100a != b, b != c, c != a首先,將a,b,c按遞增順序排好。

其次,考慮最大步數。因為排序好以後,b不能移動,所以最大步數就是a,cb靠攏的步數,即b-a-1+c-b-1

接下來考慮最小步數。分三種情況:

a,b,c已經連續,此種情況不需要移動。

b-ac-b有乙個為1,說明有一對連續,只需移動另外乙個到b即可,即1步就可以了。

b-ac-b有任意乙個為2,說明有一對之間只差乙個位置,將另乙個移到此位置即可,即1步就可以了。

其餘情況,只需要2步,分別將a和c移動到b的兩邊。

class

solution

:def

nummovesstones

(self, a:

int, b:

int, c:

int)

-> list[

int]

: l=

[a,b,c]

l.sort(

) ansmax=l[2]

-l[1]-

1+l[1]

-l[0]-

1if l[2]

-l[1

]==l[1]

-l[0]==

1:return[0

,ansmax]

elif l[2]

-l[1]==

1or l[1]

-l[0]==

1:return[1

,ansmax]

elif l[2]

-l[1]==

2or l[1]

-l[0]==

2:return[1

,ansmax]

else

:return[2

,ansmax]

在乙個10^6 x 10^6的網格中,每個網格塊的座標為(x, y),其中0 <= x, y < 10^6

我們從源方格source開始出發,意圖趕往目標方格target。每次移動,我們都可以走到網格中在四個方向上相鄰的方格,只要該方格不在給出的封鎖列表blocked上。

只有在可以通過一系列的移動到達目標方格時才返回true。否則,返回false

示例1:

輸入:blocked = [[0,1],[1,0]], source = [0,0], target = [0,2]

輸出:false

解釋:從源方格無法到達目標方格,因為我們無法在網格中移動。

示例2:

輸入:blocked = , source = [0,0], target = [999999,999999]

輸出:true

解釋:因為沒有方格被封鎖,所以一定可以到達目標方格。

0 <= blocked.length <= 200blocked[i].length == 20 <= blocked[i][j] < 10^6source.length == target.length == 20 <= source[i][j], target[i][j] < 10^6source != target這是乙個很大的網格,常規的bfs或是dfs會超時。

此時需分析,什麼情況下source到不了target?即source或者targetblocked包圍(或加上邊界)

如果可以走超過blocked數量步數(最極端情況為上圖的case3),說明沒有被blocked包圍,則必然可走出去。

class

solution

:def

isescapepossible

(self, blocked: list[list[

int]

], source: list[

int]

, target: list[

int])-

>

bool

:from collections import deque

blocked=

set(

map(

tuple

,blocked)

)def

bfs(source,target)

: queue=deque(

)(source[0]

,source[1]

,0))

visited=

set(

) visited.add(

tuple

(source)

) dirs=[(

0,1)

,(0,

-1),

(1,0

),(-

1,0)

]while queue:

x,y,step=queue.pop(

)if x==target[0]

and y==target[1]

:return

true

for i,j in dirs:

tempx=i+x

tempy=j+y

if0<=tempx<

10**

6and

0<=tempy<=

10**

6and

(tempx,tempy)

notin visited and

(tempx,tempy)

notin blocked:

visited.add(

(tempx,tempy)

)(tempx,tempy,step+1)

)if step==

len(blocked)

:return

true

return

false

return bfs(source,target)

and bfs(target,source)

leetcode 第132場周賽

愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲。示例 1 輸入 2輸出 true解釋 愛...

leetcode周賽 第176場

題目描述 給你乙個 m n 的矩陣 grid,矩陣中的元素無論是按行還是按列,都以非遞增順序排列。請你統計並返回 grid 中 負數 的數目。示例 1 輸入 grid 4,3,2,1 3,2,1,1 1,1,1,2 1,1,2,3 輸出 8 解釋 矩陣中共有 8 個負數。示例 2 輸入 grid 3...

leetcode 第 180 場周賽

大佬都是3 5分鐘一題,而我10分鐘一題,最後一題還不會。qaq 5356.矩陣中的幸運數 給你乙個m n的矩陣,矩陣中的數字各不相同。請你按任意順序返回矩陣中的所有幸運數。幸運數是指矩陣中滿足同時下列兩個條件的元素 class solution object def luckynumbers se...