LeetCode:934. Shortest Bridge - Python
问题描述:
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 <= A.length = A[0].length <= 100
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相关推荐
- 【LeetCode】934. Shortest Bridge 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS + BFS 相似题目 参考资料 日期 题目地 ...
- LeetCode:916. Word Subsets - Python
问题描述: 916. 单词子集 我们给出两个单词数组A和 B.每个单词都是一串小写字母. 现在,如果b中的每个字母都出现在a中,包括重复出现的字母,那么称单词b是单词a的子集. 例如,"wr ...
- 【Breadth-first Search 】934. Shortest Bridge
输入:一个二维数组,每个元素的值为0/1. 规则:所有连在一起的1是一个岛屿,数组中包含2个岛屿.连在一起是指上下左右4个方向.可以将0变为1,将2个岛屿链接在一起. 输出:最小改变多少个0就可以将2 ...
- LeetCode:322. 零钱兑换(python)
LeetCode:322. 零钱兑换(python) 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总 ...
- LeetCode:309. 最佳买卖股票时机含冷冻期(python)
LeetCode:309. 最佳买卖股票时机含冷冻期(python) 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能 ...
- 力扣Leetcode:5. 最长回文子串(Python)
题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 题解:动态规划 这是一道很经典的题目.首先我想到了动态规划算法: 对于子串s[i-j],它为回文子串的条件为:s[i+1 - j-1]为回文 ...
- 简明python教程 豆瓣-福利分享:个人整理的Python书单,从基础到进阶
原标题:福利分享:个人整理的Python书单,从基础到进阶 我挑选的一些书籍,大家可以自行到书店或是网上自己选购.也由于个人水平有限,很可能大家觉得优秀的书籍没有列出,如果大家有觉得不错的书籍,欢迎大 ...
- python网络爬虫权威指南 豆瓣_福利分享:个人整理的Python书单,从基础到进阶...
原标题:福利分享:个人整理的Python书单,从基础到进阶 我挑选的一些书籍,大家可以自行到书店或是网上自己选购.也由于个人水平有限,很可能大家觉得优秀的书籍没有列出,如果大家有觉得不错的书籍,欢迎大 ...
- LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)
LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...
- LeetCode 字符串简单部分 算法 python实现
''' #2018-06-02 June Saturday the 22 week, the 153 day SZ LeetCode 字符串简单部分 算法 python实现 https://leetc ...
最新文章
- linux命令:返回上一次目录
- 专业的软件安装包可以这样做!
- nssl1210-质数【素数筛】
- linux下sendmail邮件系统安装操作记录
- 编写测试用例的实用小技巧
- java怎么控制数据权限_Java权限控制算法
- 油管机器学习基础 学习笔记
- 橡胶软接头的安装及使用说明
- python画立体地球_如何在Python中绘制3D地球?
- 服务器使用CDN加速的优劣势分析
- 青春散场,初心不忘【致毕业季理想主义的你】
- root用户被提示:Operation not permitted
- 种草一个让程序员男友记住一辈子的神仙插件!
- 知其然更要知其所以然,聊聊SQLite软件架构
- 计算机专业的选择和分类
- 浅谈SEO学习方法和心态
- 值得收藏极速PDF阅读器和编辑器快捷键大全
- 佛祖保佑,永不宕机/永无bug
- 网上选课系统的设计与实现(ASP.NET)
- 科学家在类脑芯片上实现类似LSTM的功能,能效高1000倍
热门文章
- 无源贴片晶振四角引脚_贴片晶振引脚脚位地方向如何进行区分?
- NetBeans IDE教程
- 幼儿园语言活动包括哪几类_幼儿园语言教学活动提问的类型及优化设计
- Verifying dml pool data
- 真实!数据分析师到底是做什么的?
- 爱可生 mysql监控_actiontech-zabbix-mysql-monitor
- Open OnDemand部署安装使用手册
- vcftools安装碰到的坑
- 个计算机语言使用人数排行,语言使用人数排行_世界语言使用人数排名
- 智能路由器自建服务器,路由器怎么设置服务器_路由器搭建服务器