输入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;
}
没有评论:
发表评论