1. 项目背景与问题定义
最近在准备算法竞赛时遇到一道关于矩阵操作的经典题目——"建造最大岛屿"。这道题在LeetCode和各大OJ平台都有变种出现,考察的是对二维矩阵的遍历、连通区域处理以及动态规划的综合运用能力。题目通常给出一个由0和1组成的二维矩阵,其中1代表陆地,0代表水域,允许将其中一个0改为1,要求找出操作后能形成的最大岛屿面积(相连的1视为一个岛屿)。
这类题目在实际面试中经常出现变形,比如电商平台的库存分布优化、游戏地图生成算法、图像处理中的连通区域分析等场景都会用到类似思想。我用Java实现了三种不同时间复杂度的解法,下面分享从暴力破解到最优化的完整思考过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础解法:暴力DFS
2.1 算法思路
最直观的做法是遍历每个0的位置,临时将其改为1后,用深度优先搜索(DFS)计算当前岛屿面积,最后还原矩阵状态。这种方法时间复杂度为O(n^4),在n≤50时勉强可用。
java复制class Solution {
int[][] dirs = {{0,1},{1,0},{0,-1},{-1,0}};
public int largestIsland(int[][] grid) {
int max = 0;
boolean hasZero = false;
for(int i=0; i<grid.length; i++) {
for(int j=0; j<grid[0].length; j++) {
if(grid[i][j] == 0) {
hasZero = true;
grid[i][j] = 1;
max = Math.max(max, dfs(grid, i, j, new boolean[grid.length][grid[0].length]));
grid[i][j] = 0;
}
}
}
return hasZero ? max : grid.length * grid[0].length;
}
private int dfs(int[][] grid, int i, int j, boolean[][] visited) {
if(i<0 || j<0 || i>=grid.length || j>=grid[0].length || grid[i][j]==0 || visited[i][j])
return 0;
visited[i][j] = true;
int area = 1;
for(int[] dir : dirs) {
area += dfs(grid,
