Q33 Minimize Hamming Distance After Swap Operations - LeetCode 1722
Mon Jun 12 2023 09:20:14 GMT+0000 (Coordinated Universal Time)
Saved by @Ayush_dabas07
class Solution { public int minimumHammingDistance(int[] source, int[] target, int[][] allowedSwaps) { /* Q33 graph playlist */ int n = source.length; DSU main = new DSU(n); //grouping swaps for(int swap[] : allowedSwaps){ int a = swap[0] , b = swap[1]; main.union(a,b , main.parent , main.rank); } /* making a HM<Integer , HM<Int,int>> to store after swapping what values can the swap_index hold in the source array */ HashMap<Integer,HashMap<Integer,Integer>> map = new HashMap<>(); //traversing parent array and storing values for parent swap_index for(int i = 0 ;i < n ; i++){ int par = main.find(main.parent[i] , main.parent); if(map.containsKey(par) == false) map.put(par , new HashMap<>()); //taking out hashmap against swap_index HashMap<Integer,Integer> temp = map.get(par); //updating value - frequenccy temp.put(source[i] , temp.getOrDefault(source[i] , 0) +1); map.put(par , temp); } //traversing target array and making answer int ans = 0; for(int i = 0 ;i < n ; i++){ int root = main.find(i , main.parent); //parent of index i int val = target[i]; HashMap<Integer,Integer> temp = map.get(root); //if no value exist against swap_index if(temp.containsKey(val) == false){ ans++; continue; } //if frequency of value against swap_index <=0 if(temp.get(val) <= 0 ) ans++; //updating val -> frequency and updating orignal map temp.put(val , temp.get(val) -1); map.put(root , temp); } return ans; } public static class DSU{ static int parent[] , rank[]; DSU(int n ){ parent = new int[n]; rank = new int[n]; for(int i = 0 ;i < n ; i++){ parent[i] = i; rank[i] = 1; } } public int find(int child , int parent[]) { //if it is its own parent if(parent[child] == child){ return parent[child]; } int temp = find(parent[child] , parent); //optimization 1 (path compression) parent[child] = temp; return temp; } //x and y are childrens public boolean union(int x , int y , int parent[] , int rank[]){ //finding leaders int lx = find(x , parent); int ly = find(y , parent); //combining based on ranks if(lx != ly){ if(rank[lx] > rank[ly]){ parent[ly] = lx; } else if(rank[lx] < rank[ly]){ parent[lx] = ly; } else{ parent[lx] = ly; rank[ly] ++ ; } return true; } return false; } } }
Comments