题目: 以二维数组形式表示坐标岛屿,求边长。

例子:

[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]] Answer: 16
Explanation: The perimeter is the 16 yellow stripes in the image below:

思路:    一开始想用最笨的办法,就是两次for循环遍历所有元素,如果为1(1为岛屿),就分别判断 上、下、左、右 是否为岛屿,若不是则 边数+1 。

   第二次换了想法, 每一条横向 如果有岛屿,只要连续,那么左右两边和始终为2,如果不连续,则左右两边和 +2。  纵向判断 上下边 也是如此。

   所用tag记录上一格是否为岛屿 来判断是否连续,如果为连续,则这一横排的 左右边和 始终为2, 如果有一个不连续,则左右边和 +2 。

     横向判断用两次for循环,纵向判断也用两次for循环。第二层循环之前要把 tag清空,否则上一行的最后一格 和 下一行的第一格 会误判。

效率一般,更好的没想起来- -

 public class Solution {
public int islandPerimeter(int[][] grid) {
int m = 0,tag = 0; //m记录边数 ,tag作为标记 记录是否为连续岛屿
int rows = grid.length;
int columns = grid[0].length;
for(int i = 0;i < rows;i++){ //横向遍历
tag = 0 ; //下层循环 标记清零
for(int j = 0; j < columns; j++){
if(grid[i][j] == 1){
if(tag == 1){
continue;
}
m = m + 2;
tag = 1;
}
else{
tag = 0;
}
}
}
for(int j = 0; j < columns; j++){ //纵向遍历
tag = 0; //下层循环 标记清零
for(int i = 0;i < rows;i++){
if(grid[i][j] == 1){
if(tag == 1){
continue;
}
m = m + 2;
tag = 1;
}
else{
tag = 0;
}
}
} return m;
}
}

最新文章

  1. MyEclipse 的 配置文件
  2. AndroidStudio配置gradle,让App自动签名
  3. HAST 使用笔记
  4. android LayoutInflater.inflate()的参数介绍
  5. Swift - String与NSString的区别,以及各自的使用场景
  6. php json_decode返回失败的排查
  7. System.Diagnostics.Process 测试案例
  8. java数据结构之HashSet和HashMap(java核心卷Ⅰ读书笔记)
  9. jQuery源码框架fn解读
  10. Node.js配合jQuery UI autocomplete的应用
  11. Matlab文本处理:提取指定内容
  12. oracle 之 如何链接别人电脑的oracle
  13. Tempter of the Bone HDU - 1010
  14. cdh 5.13 hadoop 集群IP变更详细步骤
  15. PHP中的__clone()
  16. 微信公众号H5支付
  17. WEB网络问题的排查【转】
  18. SPD
  19. Java compiler level does not match解决方法, java 修改编译用的jdk的方法
  20. Makefile的制作

热门文章

  1. 基于dubbo的分布式系统(一)安装docker
  2. JS Generator yield
  3. 【python】windows更改jupyter notebook(ipython)的默认打开工作路径
  4. LeetCode 16. 最接近的三数之和(3Sum Closest)
  5. shell初级-----结构化命令
  6. win下gvim或者linux下的vim安装vundle都适用的配置文件 - 在当前目录及其子目录下**, 的所有文件* 中, 搜索当前光标所在的单词
  7. retrofit2+rxjava+okhttp网络请求实现
  8. android中如何自动获取短信验证码
  9. centos7成功部署OpenLDAP
  10. 纯JS实现多图片上传(在layui框架中)