Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.49 KB | None | 0 0
  1. class Solution {
  2.     public List<Integer> numIslands2(int m, int n, int[][] positions) {
  3.         DisjointSetUnion dsu = new DisjointSetUnion(positions.length);
  4.         HashMap<Point, Integer> map = new HashMap<>();
  5.         List<Integer> list = new LinkedList<>();
  6.         for (int i = 0; i < positions.length; i++) {
  7.             Point p = new Point(positions[i][0], positions[i][1]);
  8.             if (!map.containsKey(p)) {
  9.                 dsu.numSets++;
  10.                 map.put(p, i);
  11.             }
  12.             unionNeighbours(positions, i, dsu, map);
  13.             list.add(dsu.numSets);
  14.         }
  15.         return list;
  16.     }
  17.    
  18.     void unionNeighbours(int[][] positions, int i, DisjointSetUnion dsu, HashMap<Point, Integer> map) {
  19.         Point p = new Point(positions[i][0], positions[i][1]);
  20.         Point n = new Point(positions[i][0], positions[i][1]);
  21.         n.x++;
  22.         if (map.containsKey(n)) dsu.union(map.get(p), map.get(n));
  23.         n.x--;
  24.         n.y++;
  25.         if (map.containsKey(n)) dsu.union(map.get(p), map.get(n));
  26.         n.y -= 2;
  27.         if (map.containsKey(n)) dsu.union(map.get(p), map.get(n));
  28.         n.y++;
  29.         n.x--;
  30.         if (map.containsKey(n)) dsu.union(map.get(p), map.get(n));
  31.     }
  32.    
  33.     class DisjointSetUnion {
  34.         int[] parent, rank;
  35.         int numSets;
  36.         public DisjointSetUnion(int n) {
  37.             numSets = 0;
  38.             rank = new int[n];            
  39.             parent = new int[n];
  40.             for (int i = 0; i < n; i++) parent[i] = i;
  41.         }
  42.         void union(int x, int y) {
  43.             int xRoot = find(x);
  44.             int yRoot = find(y);
  45.             if (xRoot != yRoot) {
  46.                 numSets--;
  47.                 if (rank[xRoot] > rank[yRoot]) parent[yRoot] = xRoot;
  48.                 else {
  49.                     parent[xRoot] = yRoot;
  50.                     if (rank[xRoot] == rank[yRoot]) rank[yRoot]++;
  51.                 }
  52.             }
  53.         }
  54.        
  55.         int find(int x) {
  56.             if (parent[x] != x) {
  57.                 parent[x] = find(parent[x]);
  58.             }
  59.             return parent[x];
  60.         }
  61.     }
  62.    
  63.     class Point {
  64.         int x, y;
  65.         public Point(int x, int y) {
  66.             this.x = x;
  67.             this.y = y;
  68.         }
  69.         @Override
  70.         public boolean equals(Object obj) {
  71.             Point p = (Point) obj;
  72.             return x == p.x && y == p.y;
  73.         }
  74.         @Override
  75.         public int hashCode() {
  76.             return x + y;
  77.         }
  78.     }
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement