題目:
有乙個 m x n 的二元網格,其中 1 表示磚塊,0 表示空白。磚塊 穩定(不會掉落)的前提是:
一塊磚直接連線到網格的頂部,或者
至少有一塊相鄰(4 個方向之一)磚塊 穩定 不會掉落時
給你乙個陣列 hits ,這是需要依次消除磚塊的位置。每當消除 hits[i] = (rowi, coli) 位置上的磚塊時,對應位置的磚塊(若存在)會消失,然後其他的磚塊可能因為這一消除操作而掉落。一旦磚塊掉落,它會立即從網格中消失(即,它不會落在其他穩定的磚塊上)。
返回乙個陣列 result ,其中 result[i] 表示第 i 次消除操作對應掉落的磚塊數目。
注意,消除可能指向是沒有磚塊的空白位置,如果發生這種情況,則沒有磚塊掉落。
示例 1:
輸入:grid = [[1,0,0,0],[1,1,1,0]], hits = [[1,0]]
輸出:[2]
解釋:網格開始為:
[[1,0,0,0],
[1,1,1,0]]
消除 (1,0) 處加粗的磚塊,得到網格:
[[1,0,0,0]
[0,1,1,0]]
兩個加粗的磚不再穩定,因為它們不再與頂部相連,也不再與另乙個穩定的磚相鄰,因此它們將掉落。得到網格:
[[1,0,0,0],
[0,0,0,0]]
因此,結果為 [2] 。
示例 2:
輸入:grid = [[1,0,0,0],[1,1,0,0]], hits = [[1,1],[1,0]]
輸出:[0,0]
解釋:網格開始為:
[[1,0,0,0],
[1,1,0,0]]
消除 (1,1) 處加粗的磚塊,得到網格:
[[1,0,0,0],
[1,0,0,0]]
剩下的磚都很穩定,所以不會掉落。網格保持不變:
[[1,0,0,0],
[1,0,0,0]]
接下來消除 (1,0) 處加粗的磚塊,得到網格:
[[1,0,0,0],
[0,0,0,0]]
剩下的磚塊仍然是穩定的,所以不會有磚塊掉落。
因此,結果為 [0,0] 。
**(逆序+並查集):
class
unionfind
}int
find
(int x)
int newf =
find
(f[x]);
f[x]
= newf;
return f[x];}
void
merge
(int x,
int y)
f[fx]
= fy;
sz[fy]
+= sz[fx];}
intsize
(int x)};
class
solution
for(
int i =
0; i < h; i++)if
(i >
0&& status[i -1]
[j]==1)
if(j >
0&& status[i]
[j -1]
==1)}
}}const vectorint,
int>> directions,,
,}; vector<
int>
ret(hits.
size()
,0);
for(
int i = hits.
size()
-1; i >=
0; i--
)int prev = uf.
size
(h * w);if
(r ==0)
for(
const
auto
[dr, dc]
: directions)}}
int size = uf.
size
(h * w)
; ret[i]
=max(0
, size - prev -1)
; status[r]
[c]=1;
}return ret;}}
;
力扣打卡2021 2 20 陣列的度
題目 給定乙個非空且只包含非負數的整數陣列 nums,陣列的度的定義是指數組裡任一元素出現頻數的最大值。你的任務是在 nums 中找到與 nums 擁有相同大小的度的最短連續子陣列,返回其長度。示例 1 輸入 1,2,2,3,1 輸出 2 解釋 輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2...
力扣打卡2021 1 8旋轉陣列問題
題目 給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1,2,3,4,5,6,7 和 k 3 輸出 5,6,7,1,2,3,4 解釋 向右旋轉 1 步 7,1,2,3,4,5,6 向右旋轉 2 步 6,7,1,2,3,4,5 向右旋轉 3 步 5,6,7,1,2...
力扣打卡2021 1 24 最長連續遞增序列
題目 給定乙個未經排序的整數陣列,找到最長且 連續遞增的子串行,並返回該序列的長度。連續遞增的子串行 可以由兩個下標 l 和 r l r 確定,如果對於每個 l i r,都有 nums i nums i 1 那麼子串行 nums l nums l 1 nums r 1 nums r 就是連續遞增子串...