leetcode827 最大人工岛

dfs 超时
通过遍历时设置不同的标志,来遍历,也可以通过栈。
时间复杂度:O(N^4)O(N
4
),其中 NN 是 grid 的长和宽。
空间复杂度:O(N^2)O(N
2
),深度优先搜索需要的 stack 和 seen 的空间。

作者:LeetCode
链接:https://leetcode-cn.com/problems/making-a-large-island/solution/zui-da-ren-gong-dao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution:
    def largestIsland(self, grid: List[List[int]]) -> int:

        def dfs(x,y,visit,count,num):


            grid[x][y]=num
            for item in [(1,0),(0,1),(0,-1),(-1,0)]:
                cur_x=x+item[0]
                cur_y=y+item[1]

                if 0<=cur_x<len(grid) and 0<=cur_y<len(grid[0]) and grid[cur_x][cur_y]!=num and grid[cur_x][cur_y]!=0:

                    count+=1

                    count=dfs(cur_x,cur_y,visit,count,num)


            return count

        maxvalue=0
        count=0
        visit=[[0]*len(grid[0]) for _ in range(len(grid))]
        num=2
        for i in range(len(grid)):
            for j in range(len(grid[0])):

                if grid[i][j]==0:

                    grid[i][j]=1
                    print(grid)
                    count=dfs(i,j,visit,1,num)
                    grid[i][j]=0

                    num+=1

                    maxvalue=max(maxvalue,count)
        if maxvalue==0:
            return len(grid)*len(grid[0])
        return maxvalue

通过一次dfs得到所有连通的数量,将连通的位置标记上序号从2开始,因为0,1有意义的,然后遍历为0的位置,看他的上下左右是否有连通的组织,序号不一致的放入数组中,这里可以通过set控制,然后将set中的对应连通组织面积加和,注意数量不限,最后加上1,这里要判断下全1和全0的状态。

class Solution:
    def largestIsland(self, grid: List[List[int]]) -> int:

        def dfs(x,y,visit,count,num):


            grid[x][y]=num
            for item in [(1,0),(0,1),(0,-1),(-1,0)]:
                cur_x=x+item[0]
                cur_y=y+item[1]

                if 0<=cur_x<len(grid) and 0<=cur_y<len(grid[0]) and grid[cur_x][cur_y]==1:

                    count+=1

                    count=dfs(cur_x,cur_y,visit,count,num)


            return count

        maxvalue=0
        count=0
        visit=[[0]*len(grid[0]) for _ in range(len(grid))]
        num=2
        hashmap=collections.defaultdict(int)
        hashset=set()
        for i in range(len(grid)):
            for j in range(len(grid[0])):

                if grid[i][j]==1:


                    count=dfs(i,j,visit,1,num)
                    #print(grid)
                    hashmap[num]=count


                    num+=1

                    maxvalue=max(maxvalue,count)
        if maxvalue==0:
            return 1
        if maxvalue==len(grid)*len(grid[0]):
            return len(grid)*len(grid[0])
        area=0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j]==0:
                    hashset=set()
                    for item in [(1,0),(0,1),(-1,0),(0,-1)]:
                        if 0<=i+item[0]<len(grid) and 0<=j+item[1]<len(grid[0])and grid[i+item[0]][j+item[1]]!=0:
                            hashset.add(grid[i+item[0]][j+item[1]])
                    area=0
                    for k in hashset:

                        area+=hashmap[k]
                    area+=1

                maxvalue=max(maxvalue,area)                

        return maxvalue
全部评论

相关推荐

03-27 16:40
已编辑
门头沟学院 C++
26学院本太难了,很多公司机筛就给我刷了。机会都难拿到如果是简历存在问题也欢迎拷打————————————————————分割线——————————————————————2026.3.4更新:发完贴之后,时不时投递又收到了不少的笔试/面试邀请。主要是之前投递简历出去之后基本上都是沉默状态,年后好转了不少timeline:2026.01.21&nbsp;文远知行笔试,半年多没刷算法题&nbsp;-&gt;挂&nbsp;(后续HR说春招可以重新安排笔试)2026.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小鹏汇天&nbsp;技术一面,第二周收到结果&nbsp;-&gt;挂2026.2.12&nbsp;&nbsp;&nbsp;大众Cariad代招&nbsp;技术二面&nbsp;-&gt;Offer2026.2.28&nbsp;&nbsp;&nbsp;多益网络技术面试,由于风评太差,一直在犹豫要不要接面试&nbsp;-&gt;推迟-----------分割线-----------2026.3&nbsp;月前的某一天,临时去电网报名了二批计算机岗位的笔试2026.3.6&nbsp;从上家公司实习离职,氛围最好的一家公司,leader&nbsp;说可以帮忙转正,但是流程太长,而且我们部门据说只有一个&nbsp;hc,更想要研究生,我很有可能是会被签外包公司在这里干活,就离职了。2026.3.9&nbsp;入职新公司,大众Cariad&nbsp;以外部公司的身份进组,项目组签了三年,后续三年应该都可以在这里呆,不知道有没有希望原地跳槽。2026.3.10&nbsp;电网考试居然说我通过资格审查了,短信约我去参加资格审查,请假一天,买了&nbsp;12&nbsp;号晚上的机票回成都2026.3.15&nbsp;参加国家电网计算机类笔试2026.3.17&nbsp;电网出成绩了,感觉很低。觉得已经🈚️了2026.3.18&nbsp;收到电网面试通知,通知&nbsp;3.22-3.25&nbsp;这个时间去面试,我的岗位只招&nbsp;1&nbsp;个人。据说面试只有&nbsp;2-3&nbsp;人,不知道能不能成功----------分割线-----------2026.3.21&nbsp;电网面试结束,感觉回答的还勉勉强强,大概是2个岗位分别招1个人,一共11人面试,实际来了9人2026.3.27&nbsp;出面试成绩,满分100分,早上10:20左右发现面试成绩46,我震惊了,没截图,后面过了十分钟重新看发现面试成绩给我改成58了。但同样震惊。朋友问我是不是把面试官打了,哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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