问题描述:

934. 最短的桥

在给定的二维二进制数组A中,存在两座岛。(岛是由四面相连的1形成的一个最大组)

现在,我们可以将0 变为1,以使两座岛连接起来,变成一座岛。

返回必须翻转的 0的最小数目。(可以保证答案至少是1

示例 1:

输入:[[0,1],[1,0]]
输出:1

示例 2:

输入:[[0,1,0],[0,0,0],[0,0,1]]
输出:2

示例 3:

输入:[[1,1,1,1,1],[1,0,0,0,1],[1,0,1,0,1],[1,0,0,0,1],[1,1,1,1,1]]
输出:1

提示:

  1. 1 <= A.length = A[0].length <= 100
  2. A[i][j] == 0 或 A[i][j] == 1

问题分析:

这个题目比较有意思,这几天遇到的一个比较有意思的题目了。一眼看过去,基本可以想到用广度优先搜索来解决,但是很快就会意识到到一个问题。那就是,如果是点到点的搜索,很好实现,那现在是一个团(岛)到另外一个团(岛)的搜索,如何实现?其实还好,可以把一个团(岛)作为一个点(这一个大团(岛),可以用遍历操作,即每次遍历一个团(到),向外扩展),进行搜索。

(1)先找到一个小岛,可以遍历 A 找到一个点,以这个点为基础,广度优先搜索或者深度优先搜索,找到这个岛全部位置(放到一个队列 start 里面),这里,我更喜欢广度优先搜索法,简单好理解。

(2)以(1)中的队列 start 为基础,广度优先搜索,向外一层一层地扩展,每扩展一层,就更新一下 start,就是始终让它保持是一个最外层边界,直到它接触到另外一个岛。

(3)在(2)中,向外扩展的过程中,不要忘记,记录扩展了几次,这也是求得最小距离的过程。

Python3实现:

# @Time   :2018/12/01
# @Author :LiuYinxing
# 广度优先搜索class Solution:def shortestBridge(self, A):row, col = len(A), len(A[0])visited = [[0] * col for _ in range(row)]  # 负责记录其中的一个岛q = []start = []  # 保存其中一个岛的所有位置found = Falsefor i in range(row):  # 先找到一个岛中其中一个位置for j in range(col):if A[i][j] == 1:found = Trueq.append((i, j))visited[i][j] = 1breakif found:breakwhile q:  # 以其中一个岛的位置为基础,使用广度优先搜索方法,继续找到这个岛的其他位置tmp = []for a in q:x, y = a[0], a[1]start.append(a)  # 把岛的位置放到 start 队列里面if (x - 1 >= 0) and (visited[x - 1][y] == 0) and (A[x - 1][y] == 1):tmp.append((x - 1, y))visited[x - 1][y] = 1if (x + 1 < col) and (visited[x + 1][y] == 0) and (A[x + 1][y] == 1):tmp.append((x + 1, y))visited[x + 1][y] = 1if (y - 1 >= 0) and (visited[x][y - 1] == 0) and (A[x][y - 1] == 1):tmp.append((x, y - 1))visited[x][y - 1] = 1if (y + 1 < row) and (visited[x][y + 1] == 0) and (A[x][y + 1] == 1):tmp.append((x, y + 1))visited[x][y + 1] = 1q = tmpans = 0while start:  # 从一个岛出发,去找探索另外一个岛tmp = []for a in start:  # 广度优先算法,一层一层的探查 是否 到达另外一个岛x, y = a[0], a[1]if (x - 1 >= 0) and (visited[x - 1][y] == 0):if A[x - 1][y] == 1:return anselse:tmp.append((x - 1, y))visited[x - 1][y] = 1if (x + 1 < col) and (visited[x + 1][y] == 0):if A[x + 1][y] == 1:return anselse:tmp.append((x + 1, y))visited[x + 1][y] = 1if (y - 1 >= 0) and (visited[x][y - 1] == 0):if A[x][y - 1] == 1:return anselse:tmp.append((x, y - 1))visited[x][y - 1] = 1if (y + 1 < row) and (visited[x][y + 1] == 0):if A[x][y+1] == 1:return anselse:tmp.append((x, y + 1))visited[x][y + 1] = 1start = tmp  # 探索了一层之后,没有发现另外一个岛,则,更新 最外层边界 以及 路径长度ans += 1  return ansif __name__ == '__main__':A = [[1, 1, 1, 1, 1],[1, 0, 0, 0, 1],[1, 0, 1, 0, 1],[1, 0, 0, 0, 1],[1, 1, 1, 1, 1]]print(Solution().shortestBridge(A))

声明: 总结学习,有问题或不妥之处,可以批评指正哦。

题目链接:leetcode-cn.com/problems/shortest-bridge/
参考链接:参考了别人提交的优秀代码,并做了改进,链接不详。

LeetCode:934. Shortest Bridge - Python相关推荐

  1. 【LeetCode】934. Shortest Bridge 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS + BFS 相似题目 参考资料 日期 题目地 ...

  2. LeetCode:916. Word Subsets - Python

    问题描述: 916. 单词子集 我们给出两个单词数组A和 B.每个单词都是一串小写字母. 现在,如果b中的每个字母都出现在a中,包括重复出现的字母,那么称单词b是单词a的子集. 例如,"wr ...

  3. 【Breadth-first Search 】934. Shortest Bridge

    输入:一个二维数组,每个元素的值为0/1. 规则:所有连在一起的1是一个岛屿,数组中包含2个岛屿.连在一起是指上下左右4个方向.可以将0变为1,将2个岛屿链接在一起. 输出:最小改变多少个0就可以将2 ...

  4. LeetCode:322. 零钱兑换(python)

    LeetCode:322. 零钱兑换(python) 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总 ...

  5. LeetCode:309. 最佳买卖股票时机含冷冻期(python)

    LeetCode:309. 最佳买卖股票时机含冷冻期(python) 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能 ...

  6. 力扣Leetcode:5. 最长回文子串(Python)

    题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 题解:动态规划 这是一道很经典的题目.首先我想到了动态规划算法: 对于子串s[i-j],它为回文子串的条件为:s[i+1 - j-1]为回文 ...

  7. 简明python教程 豆瓣-福利分享:个人整理的Python书单,从基础到进阶

    原标题:福利分享:个人整理的Python书单,从基础到进阶 我挑选的一些书籍,大家可以自行到书店或是网上自己选购.也由于个人水平有限,很可能大家觉得优秀的书籍没有列出,如果大家有觉得不错的书籍,欢迎大 ...

  8. python网络爬虫权威指南 豆瓣_福利分享:个人整理的Python书单,从基础到进阶...

    原标题:福利分享:个人整理的Python书单,从基础到进阶 我挑选的一些书籍,大家可以自行到书店或是网上自己选购.也由于个人水平有限,很可能大家觉得优秀的书籍没有列出,如果大家有觉得不错的书籍,欢迎大 ...

  9. LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)

    LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...

  10. LeetCode 字符串简单部分 算法 python实现

    ''' #2018-06-02 June Saturday the 22 week, the 153 day SZ LeetCode 字符串简单部分 算法 python实现 https://leetc ...

最新文章

  1. linux命令:返回上一次目录
  2. 专业的软件安装包可以这样做!
  3. nssl1210-质数【素数筛】
  4. linux下sendmail邮件系统安装操作记录
  5. 编写测试用例的实用小技巧
  6. java怎么控制数据权限_Java权限控制算法
  7. 油管机器学习基础 学习笔记
  8. 橡胶软接头的安装及使用说明
  9. python画立体地球_如何在Python中绘制3D地球?
  10. 服务器使用CDN加速的优劣势分析
  11. 青春散场,初心不忘【致毕业季理想主义的你】
  12. root用户被提示:Operation not permitted
  13. 种草一个让程序员男友记住一辈子的神仙插件!
  14. 知其然更要知其所以然,聊聊SQLite软件架构
  15. 计算机专业的选择和分类
  16. 浅谈SEO学习方法和心态
  17. 值得收藏极速PDF阅读器和编辑器快捷键大全
  18. 佛祖保佑,永不宕机/永无bug
  19. 网上选课系统的设计与实现(ASP.NET)
  20. 科学家在类脑芯片上实现类似LSTM的功能,能效高1000倍

热门文章

  1. 无源贴片晶振四角引脚_贴片晶振引脚脚位地方向如何进行区分?
  2. NetBeans IDE教程
  3. 幼儿园语言活动包括哪几类_幼儿园语言教学活动提问的类型及优化设计
  4. Verifying dml pool data
  5. 真实!数据分析师到底是做什么的?
  6. 爱可生 mysql监控_actiontech-zabbix-mysql-monitor
  7. Open OnDemand部署安装使用手册
  8. vcftools安装碰到的坑
  9. 个计算机语言使用人数排行,语言使用人数排行_世界语言使用人数排名
  10. 智能路由器自建服务器,路由器怎么设置服务器_路由器搭建服务器