1. 程式人生 > >LeetCode 947 驗證棧序列

LeetCode 947 驗證棧序列

原題目連結: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; } } };