LeetCode——岛屿最大面积

题目:
给定一个包含了一些 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;
}

**其中需要学习的有:

  1. vector的二维表示方法:int 二维vector数组可表示为 vector<vector<int>>a,访问时只需要a[i][j]访问就行。
  2. 有专门的stack头文件,就叫<stack>,里边包含着stack的绝大部分函数。用的时候需要声明一下stack的数据类型。`stack a
  3. 其中的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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值