LeetCode 947 驗證棧序列
阿新 • • 發佈:2018-12-02
原題目連結:LeetCode947
分類
LeetCode
題意
在二維平面上,我們將石頭放置在一些整數座標點上。每個座標點上最多隻能有一塊石頭。
現在,move 操作將會移除與網格上的另一塊石頭共享一列或一行的石頭。
我們最多能執行多少次 move 操作?
樣例輸入輸出
示例 1:
**輸入:**stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
**輸出:**5
示例 2:
**輸入:**stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
**輸出:**3
示例 3:
**輸入:**stones = [[0,0]]
**輸出:**0
想法
這個題變一下就是,橫或者縱座標相等的座標點會互相連結構成一個區域,問總的有多少個獨立的區域。結果是總的石頭數減去獨立區域數。
並查集
程式碼
/**
* Author: GatesMa
* Email: [email protected]
* Todo: ACM Training
* Date:2018/12/2
*/
class Solution {
public:
int removeStones(vector<vector<int>>& stones) {
if(stones.size() <= 1) return 0;
int res = stones.size(), len = stones.size();
vector<int> p(len,-1);
for(int i =0;i < len;i++){
for(int j = i+1;j < len;j++){
if(stones[j][0] == stones[i][0] || stones[j][1] == stones[i] [1])
u(p, i, j);
}
}
for(auto e : p){
if(e == -1) res--;
}
return res;
}
int f(vector<int>& p,int x){
if(p[x] == -1) return x;
return f(p, p[x]);
}
void u(vector<int>& p,int i,int j){
int fi = f(p, i);
int fj = f(p, j);
if(fi != fj){
p[fi] = fj;
}
}
};