题解 | #岛屿数量#

岛屿数量

https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e

2022.0831算法第46题岛屿数量
最近学习了递归回溯算法,解决排列,组合,子集,分割字符串和网格问题
排列,组合,子集这三个已经写过,感觉就是模板,最难的操作在于想通树形结构怎么画
同时剪枝的操作也很重要,同时也十分的难想。
岛屿数量这道题,并不是标准的回溯,只是用到了递归。
刚开始有点想法,感觉就是用递归,但是对于具体的思路没想法,不会。
看了解析之后,理解是将每次遇到的1和它连通的区域都赋值为0,这样就一次遇到一个岛屿(连通域)
这样感觉还没回溯好想,总会有一些具体的代码或者过程想不通
刚开始边界处理我就想的比较复杂,想着这样就太麻烦了
结果看了代码明白不用考虑那么多情况,每次子需要保证当前函数的参数是有意义的就行。
下面介绍一下解题思路:
首先,需要编写dfs函数,将连通的区域都赋值为0,
需要指出当前格子的位置,(i,j)
并且需要对i,j进行边界判断,只处理符合要求的位置,并且要指定迭代跳出的条件
遇到0就停止迭代
//刚开始想到了边界,但是觉着很麻烦,其实还是自己想复杂了
//边界条件,[0-size),要确保i和j正确,比如i=0时,i-1就不用考虑了
if(i<0||i>=grid.size()||j<0||j>=grid[0].size()||grid[i][j]=='0')
    return ;
然后每调用一次就将当前位置赋为0,
重复对四个邻居调用
grid[i][j]='0';
//对相邻的四个格子进行处理,这时候不需要考虑边缘格子
//边缘格子会直接进行处理
dfs(grid,i-1,j);//上
dfs(grid,i,j-1);//左
dfs(grid,i+1,j);//下
dfs(grid,i,j+1);//右   
这样dfs函数就写好了,能够将一片连通域全部赋为0
void dfs(vector<vector<char> >& grid,int i,int j){
    //刚开始想到了边界,但是觉着很麻烦,其实还是自己想复杂了
    //边界条件,[0-size),要确保i和j正确,比如i=0时,i-1就不用考虑了
    if(i<0||i>=grid.size()||j<0||j>=grid[0].size()||grid[i][j]=='0')
        return ;
    //将此时的位置赋为0
    grid[i][j]='0';
    //对相邻的四个格子进行处理,这时候不需要考虑边缘格子
    //边缘格子会直接进行处理
    dfs(grid,i-1,j);//上
    dfs(grid,i,j-1);//左
    dfs(grid,i+1,j);//下
    dfs(grid,i,j+1);//右   
}    
在主函数中进行调用,
首先要确保网格非空
//确保网格中有一个数grid[0]有意义
if(grid.size()==0)
    return 0;
//记录岛屿的数量(连通的个数)
int nums=0;
之后遍历网格,将每个岛屿改变属性。
//遍历网格
for(int i=0;i<grid.size();i++){
    for(int j=0;j<grid[0].size();j++){
        //当遇到为1的网格,调用dfs,将相通的格子都赋值为0
        //没遇到一次1,则代表一个岛屿(一片区域)
        if(grid[i][j]=='1'){
            dfs(grid,i,j);
            nums++;
        }                
    }
}
//返回岛屿个数
return nums;
最后返回岛屿数量。






#算法题#
全部评论

相关推荐

03-08 18:11
门头沟学院 Java
想要实习的牛:这么牛逼的简历都吃瘪吗🌚那我不寄了
点赞 评论 收藏
分享
一共一个小时,面试难度以及自己的回答算是最近的面试压力比较大的,实习问了30分钟,中间穿插八股。1.redis数据结构2.redis持久化机制3.mysql索引底层4.聚簇索引与非聚簇索引5.索引优化6.索引失效7.mysql执行一条sql8.那么多索引mysql怎么选(不会)9.tcp与udp区别10.tcp为什么可靠11.消息队列作用12.kafka怎么保证消息有序性13.mcp是什么?14.skills是什么?15.jvm内存分配与回收过程(我讲了从创建对象到判断垃圾对象到垃圾回收我全说了一遍,是这个吗?)16.fullgc触发机制17.tcp的拥塞控制流程(不会了)18.分布式事务解决方案,说了2pc,3pc,tcc。算法是反转双向链表,没有按格式输出,但是面试官没让继续写了,面完以为挂了,结果晚上秒过,看看复试什么情况吧。今天百度打电话准备发offer了,业务跟在手子的差不多,很垂,并且说不分日常暑期,只看表现,会有转正机会,但是考虑再三还是拒绝了,百度实习薪资确实有点低,title也不如之前了,但是面试的二位业务老师我很喜欢,对我的评价也不错,希望之后能有机会共事。从三月份到现在一共面了六家,面试次数总共是8场,情况如下:脉脉二面(无答复,默认挂)百度二面已oc美团一面过,下周一二面shein一面过直接HR面游族一面过直接HR面腾讯一面过等待约二面滴滴明天一面面试通过率还是蛮高的,但是大部分都是日常,感觉对我现在的加成不大,大概率不会去,不知道暑期会是什么情况呢唉,希望能有面试吧,继续加油。字节被无hc直接取消了,现在还没人捞,有没有字节HR救救我
不管什么都不想跳动了:本人美团百度快手都待过,建议肯定是直接留快手多一点产出后转正or直接冲字节腾讯暑期吧。一是快手从福利到基建都吊打另外两家。美团现在这个业务比较惨,本来毛利就很低,亏损严重,今年很可能要优化人力降低成本,去了别说日常,就算暑期后面都很可能被优化。百度其实实习生权限挺高的,可以接触到一些含金量高的项目,但是现在的风评不如之前了,薪资也不高。二是转正概率和薪资是跟产出挂钩的,你都在手子已经积累产出了,去其他家日常实习产出都是从0开始,肯定不可能有你在手子转正可能性大啊,现在日常压根没必要去,而且我有两个师弟都是在快手日常转正的,不用太担心,安心留在手子一边多做一点产出然后一边冲字节腾讯暑期,字节腾讯今年实习岗位非常多的,不如好好把握这个,加油。
查看18道真题和解析
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务