题目:
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为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/problems/max-area-of-island
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
此题目与之前做的走迷宫问题有异曲同工之妙,用栈计算可以提升效率。
int maxAreaOfIsland(vector<vector<int>>& grid) {
int ans = 0;
for (int i = 0; i != grid.size(); ++i)//下边理论上就一个for循环,所以这个for循环可以不写大括号
for (int j = 0; j != grid[0].size(); ++j) {//每个ij开始走一遍循环
int cur = 0;
stack<int> stacki;
stack<int> stackj;//对行列各建一个栈
stacki.push(i);
stackj.push(j);
while (!stacki.empty()) {//i栈和j栈是同步进同步出的(俩数组一块才有意义),i栈不空j栈就不空
int cur_i = stacki.top(), cur_j = stackj.top();
stacki.pop();
stackj.pop();//把数取出来并且把栈清空(栈本来就一个元素),方便下一步判定。
if (cur_i < 0 || cur_j < 0 || cur_i == grid.size() || cur_j == grid[0].size() || grid[cur_i][cur_j] != 1)
continue;//如果这个数不合法,直接略过其他回到循环,顺便把这个数捡了。然后stack是空的,直接退出。
++cur;
grid[cur_i][cur_j] = 0;//标0防止一遍又一遍。
int di[4] = { 0, 0, 1, -1 };
int dj[4] = { 1, -1, 0, 0 };
for (int index = 0; index != 4; ++index) {//把四个方向的下一个位置都压进去,回到while继续判别。
int next_i = cur_i + di[index], next_j = cur_j + dj[index];
stacki.push(next_i);
stackj.push(next_j);
}
}
ans = max(ans, cur);
}
return ans;
}
**其中需要学习的有:
- vector的二维表示方法:int 二维vector数组可表示为
vector<vector<int>>a
,访问时只需要a[i][j]访问就行。 - 有专门的stack头文件,就叫
<stack>
,里边包含着stack的绝大部分函数。用的时候需要声明一下stack的数据类型。`stack a - 其中的continue语句很值得学习,可以直接省略之后的语句继续开始循环。`**
还可以用队列来表示,原理类似。队列暂时未学到,学完会补充。
int maxAreaOfIsland(vector<vector<int>>& grid) {
int ans = 0;
for (int i = 0; i != grid.size(); ++i)
for (int j = 0; j != grid[0].size(); ++j) {
int cur = 0;
queue<int> queuei;
queue<int> queuej;
queuei.push(i);
queuej.push(j);
while (!queuei.empty()) {
int cur_i = queuei.front(), cur_j = queuej.front();
queuei.pop();
queuej.pop();
if (cur_i < 0 || cur_j < 0 || cur_i == grid.size() || cur_j == grid[0].size() || grid[cur_i][cur_j] != 1)
continue;
++cur;
grid[cur_i][cur_j] = 0;
int di[4] = {0, 0, 1, -1};
int dj[4] = {1, -1, 0, 0};
for (int index = 0; index != 4; ++index) {
int next_i = cur_i + di[index], next_j = cur_j + dj[index];
queuei.push(next_i);
queuej.push(next_j);
}
}
ans = max(ans, cur);
}
return ans;
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/max-area-of-island/solution/dao-yu-de-zui-da-mian-ji-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。