一、前言
问题来源LeetCode
问题链接:https://leetcode-cn.com/explore/interview/card/bytedance/243/array-and-sorting/1034/
二、题目
给定一个包含了一些 0 和 1 的非空二维数组 grid 。一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
示例 1:
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]
对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。
示例 2:
[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0。
注意: 给定的矩阵grid 的长度和宽度都不超过 50。
三、思路
用回溯法,简单直接
四、编码实现
//==========================================================================
/**
* @file : 02_MaxAreaOfIsland.h
* @blogs : https://blog.csdn.net/nie2314550441/article/details/106863629
* @author : niebingyu
* @title : 岛屿的最大面积
* @purpose : 给定一个包含了一些 0 和 1 的非空二维数组 grid 。
* 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
* 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
*
* 示例 1:
* [[0,0,1,0,0,0,0,1,0,0,0,0,0],
* [0,0,0,0,0,0,0,1,1,1,0,0,0],
* [0,1,1,0,1,0,0,0,0,0,0,0,0],
* [0,1,0,0,1,1,0,0,1,0,1,0,0],
* [0,1,0,0,1,1,0,0,1,1,1,0,0],
* [0,0,0,0,0,0,0,0,0,0,1,0,0],
* [0,0,0,0,0,0,0,1,1,1,0,0,0],
* [0,0,0,0,0,0,0,1,1,0,0,0,0]]
* 对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。
*
* 示例 2:
* [[0,0,0,0,0,0,0,0]]
* 对于上面这个给定的矩阵, 返回 0。
* 注意: 给定的矩阵grid 的长度和宽度都不超过 50。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/explore/interview/card/bytedance/243/array-and-sorting/1034/
*/
//==========================================================================
#pragma once
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define NAMESPACE_MAXAREAOFISLAND namespace NAME_MAXAREAOFISLAND {
#define NAMESPACE_MAXAREAOFISLANDEND }
NAMESPACE_MAXAREAOFISLAND
class Solution
{
public:
int maxAreaOfIsland(vector<vector<int>>& grid)
{
if (grid.empty() || grid[0].empty())
return 0;
// 这里按照题意给定的是矩形,不做校验
int maxRet = 0;
for (int i = 0; i < grid.size(); ++i)
{
for (int j = 0; j< grid[0].size(); ++j)
{
if (grid[i][j] == 1)
{
maxRet = max(maxRet, maxAreaOfIsland(grid, i, j));
}
}
}
return maxRet;
}
private:
int maxAreaOfIsland(vector<vector<int>>& grid, int i, int j)
{
if (i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] != 1)
return 0;
// 这里按照题意给定的是矩形,不做校验
int ret = 1;
grid[i][j] = 2; //2 标记为已经访问
static int dir[4][2] = { {0,1}, {1,0}, {0,-1}, {-1,0} };
for (int k = 0; k < 4; ++k)
{
int ix = i + dir[k][0];
int jx = j + dir[k][1];
if (ix >= 0 && ix < grid.size() && jx >= 0 && jx < grid[0].size())
{
ret += maxAreaOfIsland(grid, ix, jx);
}
}
return ret;
}
};
//
// 测试 用例 START
void test(const char* testName, vector<vector<int>>& grid, int expect)
{
Solution S;
int result = S.maxAreaOfIsland(grid);
// 粗略校验
if (result == expect)
cout << testName << ", solution passed." << endl;
else
cout << testName << ", solution failed. result:" << result << " ,expect:" << expect << endl;
}
// 测试用例
void Test1()
{
vector<vector<int>> grid =
{
{0,0,0,0,0,0,0,0}
};
int expect = 0;
test("Test1()", grid, expect);
}
void Test2()
{
vector<vector<int>> grid =
{
{0,1},
{1,1},
};
int expect = 3;
test("Test2()", grid, expect);
}
void Test3()
{
vector<vector<int>> grid =
{
{1,1,1},
{1,0,1},
};
int expect = 5;
test("Test3()", grid, expect);
}
void Test4()
{
vector<vector<int>> grid =
{
{0,0,0},
{0,1,1},
};
int expect = 2;
test("Test4()", grid, expect);
}
void Test5()
{
vector<vector<int>> grid =
{
{0,0,1,0,0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,1,0,0,0},
{0,1,1,0,1,0,0,0,0,0,0,0,0},
{0,1,0,0,1,1,0,0,1,0,1,0,0},
{0,1,0,0,1,1,0,0,1,1,1,0,0},
{0,0,0,0,0,0,0,0,0,0,1,0,0},
{0,0,0,0,0,0,0,1,1,1,0,0,0},
{0,0,0,0,0,0,0,1,1,0,0,0,0}
};
int expect = 6;
test("Test5()", grid, expect);
}
NAMESPACE_MAXAREAOFISLANDEND
// 测试 用例 END
//
void MaxAreaOfIsland_Test()
{
NAME_MAXAREAOFISLAND::Test1();
NAME_MAXAREAOFISLAND::Test2();
NAME_MAXAREAOFISLAND::Test3();
NAME_MAXAREAOFISLAND::Test4();
NAME_MAXAREAOFISLAND::Test5();
}
执行结果: