給定 n, m, 分別代表一個二維矩陣的行數和列數, 并給定一個大小為 k 的二元數組A. 初始二維矩陣全0. 二元數組A內的k個元素代表k次操作, 設第 i 個元素為 (A[i].x, A[i].y), 表示把二維矩陣中下標為A[i].x行A[i].y列的元素由海洋變為島嶼. 問在每次操作之后, 二維矩陣中島嶼的數量. 你需要返回一個大小為k的數組.
樣例 1:
輸入: n =4, m =5,
A =[[1,1],[0,1],[3,3],[3,4]]
輸出:[1,1,2,2]
解釋:0.000000000000000000001.000000100000000000002.010000100000000000003.010000100000000000104.01000010000000000011樣例 2:
輸入: n =3, m =3,
A =[[0,0],[0,1],[2,2],[2,1]]
輸出:[1,1,2,2]
注意事項
設定0表示海洋,1代表島嶼, 并且上下左右相鄰的1為同一個島嶼.
/*** Definition for a point.* struct Point {* int x;* int y;* Point() : x(0), y(0) {}* Point(int a, int b) : x(a), y(b) {}* };*/classSolution{public:/*** @param n: An integer* @param m: An integer* @param operators: an array of point* @return: an integer array*/vector<int> f;int island =0;voidmerge(int a,int b){int fa =find(a), fb =find(b);if(fa != fb){island--;f[fa]= fb;}}intfind(int a){if(a == f[a])return a;return f[a]=find(f[a]);}vector<int>numIslands2(int n,int m, vector<Point>&operators){// write your code heref.resize(n*m);for(int i =0; i < m*n;++i)f[i]= i;unordered_set<int> landmark;//保存陸地,壓縮為一維vector<vector<int>> dir ={{1,0},{0,1},{-1,0},{0,-1}};vector<int>ans(operators.size());for(int i =0; i < operators.size();++i){int x = operators[i].x;int y = operators[i].y;int idx = m*x + y;if(!landmark.count(idx)){//新的陸地landmark.insert(idx);island++;for(int k =0; k <4;++k){//周圍的地方int nx = x+dir[k][0];int ny = y+dir[k][1];int nidx = m*nx+ny;if(nx>=0&& nx <n && ny>=0&& ny < m && landmark.count(nidx)){// 新陸地的四周在界內,且是陸地merge(idx, nidx);// 合并}}}ans[i]= island;}return ans;}};