2016年10月6日星期四

Counting Groups

1.题意:
输入2D matrix(n*n),每个cell为0或1,如果|i1-i2|+|j1-j2|=1 and both value =1那么是一个group里边的。
再给你一个group size list, 每个元素是group size大小,返回一个相应的list,每个元素是对应group size 的group 数

2.算法:
首先|i1-i2|+|j1-j2|=1 这个条件是(i,j)的上下左右满足,其次要value都是1

对value是1的点进行dfs,用一个visited hash 来避免重复

用map sizeToCount 记录group size 和这个size的group数量

 public static void group(int[][] matrix){   
       int n = matrix.length;  
    Map<Integer,Integer> visited = new HashMap<>();   
    for(int i = 0; i < n; i++){   
       for(int j = 0; j < n; j++){   
         dfs(matrix,visited,i,j);   
       }   
    }   
  }   
 public static int dfs(int[][]matrix,Map<Integer,Integer>visited,int i, int j){   
       int n = matrix.length;  
    if(i<0||j<0||i>=n||j>=n) return 0;   
    if(matrix[i][j] == 0 || !visited.containsKey(i*n+j)) return 0;   
    int ans = 1;   
    visited.put(i*n+j,0);   
    ans += dfs(matrix,visited,i-1,j);   
    ans += dfs(matrix,visited,i,j-1);   
    ans += dfs(matrix,visited,i+1,j);   
    ans += dfs(matrix,visited,i,j+1);   
    visited.put(i*n+j,ans);   
    sizeToCount.putIfAbsent(ans,0);  
    sizeToCount.put(ans,sizeToCount.get(ans)+1);  
    return ans;   
  }   

没有评论:

发表评论