生成更大的陆地 Making A Large Island
2024-08-26 05:33:38
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);
}
最新文章
- JavaScript之糟粕
- 在C代码中调用C++接口
- 推荐几个优秀的java爬虫项目
- js中实现页面跳转
- ReactiveCocoa_v2.5 源码解析之架构总览
- struts2+spring3+hibernate3+mysql简单登录实现
- ElasticSearch + Canal 开发千万级的实时搜索系统
- 前端性能优化成神之路--SSR(服务端渲染)
- gethostbyname(domain) 老是返回 NULL, 凌乱了
- 20155330 2016-2017-2 《Java程序设计》第六周学习总结
- NLTK 3.2.2 安装经验
- 学习html/css基础的重点笔记
- 互斥锁pthread_mutex_init()函数
- redis make错误处理
- jQuery object and DOM Element
- Splunk Enterprise architecture——转发器本质上是日志收集client附加负载均衡,indexer是分布式索引,外加一个集中式管理协调的中心节点
- dir matlab
- 在iOS项目中引入MVVM
- css图片+文字浮动(文字包围效果)
- 【luogu P4017 最大食物链计数】 题解
热门文章
- 01:saltstack 基本使用
- opencv学习之路(2)、读取视频,读取摄像头
- ODAC(V9.5.15) 学习笔记(三)TOraSession(1)
- Bootstrap3基础 btn-xs/sm... 按钮的四种大小
- PyCharm史上最强攻略
- 抠图|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)
- Read.csv: some rows are missing
- [bzoj 4034][HAOI 2015]树上操作
- Tengine(nginx) 搭建Tomcat集群
- 【C#】取整函数Math.Round、Math.Ceiling和Math.Floor区别