2018-10-06 19:44:18

问题描述:

问题求解:

经典的求连通块问题的扩展,问题规模不大,可以暴力求解。

解法一、Brute Force O(n^4)

    int[][] dirs = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    public int largestIsland(int[][] grid) {
int res = Integer.MIN_VALUE;
int n = grid.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) res = Math.max(res, helper(grid, i, j, new int[n][n]));
else {
grid[i][j] = 1;
res = Math.max(res, helper(grid, i, j, new int[n][n]));
grid[i][j] = 0;
}
}
}
return res;
} private int helper(int[][] grid, int x, int y, int[][] used) {
int n = grid.length;
int res = 1;
used[x][y] = 1;
for (int[] dir : dirs) {
int px = x + dir[0];
int py = y + dir[1];
if (px < 0 || px >= n || py < 0 || py >= n || used[px][py] == 1 || grid[px][py] == 0) continue;
res += helper(grid, px, py, used);
}
return res;
}

解法二、

为每个连通块做上标记,并得到每个连通块的面积,之后再对0进行遍历,依次寻找其四个相邻的边的area,将他们加起来再从中取max。算法总的时间复杂度为O(n ^ 2)。

    public int largestIsland(int[][] grid) {
int res = Integer.MIN_VALUE;
int n = grid.length;
Map<Integer, Integer> map = new HashMap<>();
int color = 0;
int area = 0;
map.put(color++, area);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) area = dfs(grid, i, j, ++color);
map.put(color, area);
res = Math.max(res, area);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 0) {
int curArea = 1;
Set<Integer> set = new HashSet<>();
set.add(getColor(grid, i - 1, j));
set.add(getColor(grid, i + 1, j));
set.add(getColor(grid, i, j + 1));
set.add(getColor(grid, i, j - 1));
for (int c : set) {
curArea += map.get(c);
}
res = Math.max(res, curArea);
}
}
}
return res;
} private int getColor(int[][] grid, int x, int y) {
if (x < 0 || x >= grid.length || y < 0 || y >= grid.length) return 0;
else return grid[x][y];
} private int dfs(int[][] grid, int x, int y, int color) {
if (x < 0 || x >= grid.length || y < 0 || y >= grid.length || grid[x][y] != 1) return 0;
grid[x][y] = color;
return 1 + dfs(grid, x + 1, y, color) + dfs(grid, x - 1, y, color) +
dfs(grid, x, y - 1, color) + dfs(grid, x, y + 1, color);
}

最新文章

  1. JavaScript之糟粕
  2. 在C代码中调用C++接口
  3. 推荐几个优秀的java爬虫项目
  4. js中实现页面跳转
  5. ReactiveCocoa_v2.5 源码解析之架构总览
  6. struts2+spring3+hibernate3+mysql简单登录实现
  7. ElasticSearch + Canal 开发千万级的实时搜索系统
  8. 前端性能优化成神之路--SSR(服务端渲染)
  9. gethostbyname(domain) 老是返回 NULL, 凌乱了
  10. 20155330 2016-2017-2 《Java程序设计》第六周学习总结
  11. NLTK 3.2.2 安装经验
  12. 学习html/css基础的重点笔记
  13. 互斥锁pthread_mutex_init()函数
  14. redis make错误处理
  15. jQuery object and DOM Element
  16. Splunk Enterprise architecture——转发器本质上是日志收集client附加负载均衡,indexer是分布式索引,外加一个集中式管理协调的中心节点
  17. dir matlab
  18. 在iOS项目中引入MVVM
  19. css图片+文字浮动(文字包围效果)
  20. 【luogu P4017 最大食物链计数】 题解

热门文章

  1. 01:saltstack 基本使用
  2. opencv学习之路(2)、读取视频,读取摄像头
  3. ODAC(V9.5.15) 学习笔记(三)TOraSession(1)
  4. Bootstrap3基础 btn-xs/sm... 按钮的四种大小
  5. PyCharm史上最强攻略
  6. 抠图|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)
  7. Read.csv: some rows are missing
  8. [bzoj 4034][HAOI 2015]树上操作
  9. Tengine(nginx) 搭建Tomcat集群
  10. 【C#】取整函数Math.Round、Math.Ceiling和Math.Floor区别