三枚石子放置在數軸上,位置分別為a
,b
,c
。
每一回合,我們假設這三枚石子當前分別位於位置x, y, z
且x < y < z
。從位置x
或者是位置z
拿起一枚石子,並將該石子移動到某一整數字置k
處,其中x < k < z
且k != 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 <= 100
1 <= b <= 100
1 <= c <= 100
a != b, b != c, c != a
首先,將a,b,c
按遞增順序排好。
其次,考慮最大步數。因為排序好以後,b
不能移動,所以最大步數就是a
,c
向b
靠攏的步數,即b-a-1+c-b-1
。
接下來考慮最小步數。分三種情況:
a,b,c
已經連續,此種情況不需要移動。
b-a
和c-b
有乙個為1
,說明有一對連續,只需移動另外乙個到b
即可,即1
步就可以了。
b-a
和c-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 <= 200
blocked[i].length == 2
0 <= blocked[i][j] < 10^6
source.length == target.length == 2
0 <= source[i][j], target[i][j] < 10^6
source != target
這是乙個很大的網格,常規的bfs或是dfs會超時。
此時需分析,什麼情況下source
到不了target
?即source
或者target
被blocked
包圍(或加上邊界)
如果可以走超過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...