Island Perimeter (下)
来源:互联网 发布:电子教室软件是什么 编辑:程序博客网 时间:2024/06/18 13:45
public:
int islandPerimeter(vector<vector<int>>& grid) {
if(grid.size()==0|| grid[0].size()==0) return 0;
int a= grid.size();
int b= grid[0].size();
int result=0;
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
if (grid[i][j]==0)
break;
result+=4;
if(i>0&&grid[i-1][j]!=0&&grid[i][j])
result-=2;
if(j>0&&grid[i][j-1]!=0&&grid[i][j])
result-=2;
}
}
return result;
}
};
答案一直是10,不知道问题在哪。
根据12,和博客:https://www.cnblogs.com/grandyang/p/6096138.html
Example:
[[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]]Answer: 16Explanation: The perimeter is the 16 yellow stripes in the image below:
这道题给了我们一个格子图,若干连在一起的格子形成了一个小岛,规定了图中只有一个相连的岛,且岛中没有湖,让我们求岛的周长。我们知道一个格子有四条边,但是当两个格子相邻,周围为6,若某个格子四周都有格子,那么这个格子一条边都不算在周长里。那么我们怎么统计出岛的周长呢?第一种方法,我们对于每个格子的四条边分别来处理,首先看左边的边,只有当左边的边处于第一个位置或者当前格子的左面没有岛格子的时候,左边的边计入周长。其他三条边的分析情况都跟左边的边相似,这里就不多叙述了,参见代码如下:
解法一:
class Solution {public: int islandPerimeter(vector<vector<int>>& grid) { if (grid.empty() || grid[0].empty()) return 0; int m = grid.size(), n = grid[0].size(), res = 0; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == 0) continue; if (j == 0 || grid[i][j - 1] == 0) ++res; if (i == 0 || grid[i - 1][j] == 0) ++res; if (j == n - 1 || grid[i][j + 1] == 0) ++res; if (i == m - 1 || grid[i + 1][j] == 0) ++res; } } return res; }};
下面这种方法对于每个岛屿格子先默认加上四条边,然后检查其左面和上面是否有岛屿格子,有的话分别减去两条边,这样也能得到正确的结果,参见代码如下:
解法二:
class Solution {public: int islandPerimeter(vector<vector<int>>& grid) { if (grid.empty() || grid[0].empty()) return 0; int res = 0, m = grid.size(), n = grid[0].size(); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == 0) continue; res += 4; if (i > 0 && grid[i - 1][j] == 1) res -= 2; if (j > 0 && grid[i][j - 1] == 1) res -= 2; } } return res; }};
根据第二个方案知道 用continue!!!!!!!!!!!!
break和continue都是用来控制循环结构的,主要是停止循环。
1.break
有时候我们想在某种条件出现的时候终止循环而不是等到循环条件为false才终止。
这是我们可以使用break来完成。break用于完全结束一个循环,跳出循环体执行循环后面的语句。
2.continue
continue和break有点类似,区别在于continue只是终止本次循环,接着还执行后面的循环,break则完全终止循环。
可以理解为continue是跳过当次循环中剩下的语句,执行下一次循环。
所以,break时候,每次为0时跳出内循环,
4+4-2-2+4-2+4+4-2-2=10.
class Solution {public: int islandPerimeter(vector<vector<int>>& grid) { if(grid.size()==0|| grid[0].size()==0) return 0; int a= grid.size(); int b= grid[0].size(); int result=0; for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { if (grid[i][j]==0) continue; result+=4; if(i>0&&grid[i-1][j]!=0&&grid[i][j]) result-=2; if(j>0&&grid[i][j-1]!=0&&grid[i][j]) result-=2; } } return result; }};
- Island Perimeter (下)
- Island Perimeter (上)
- Island Perimeter (中)
- 463. Island Perimeter (C++)
- Island Perimeter
- Island Perimeter
- Island Perimeter
- Island Perimeter
- Island Perimeter
- Island Perimeter
- Island Perimeter
- Island Perimeter
- Island Perimeter
- Island Perimeter
- Island Perimeter
- Island Perimeter
- 463. Island Perimeter
- 463. Island Perimeter
- Python笔记----冒泡算法和斐波那契数列
- Android代码创建一张图,绘制内容后保存
- hdoj 1073 online judge (刻骨铭心的水题)
- Java时间日期格式转换
- 找不到夜神模拟器
- Island Perimeter (下)
- iOS中block的简单使用及注意点
- kubernetes Sandbox删除详解
- iOS开发初级错误 Expression is not assignable
- jdk8.0 内存划分
- 机器学习的动机与应用
- 进程 线程 多进程 多线程之间的差异以及优缺点
- 机器学习 学习资源
- 深入理解c语言指针-第四章