go面试题 腐烂的苹果(橘子、水果)
题目:给定一个n m的网格,其中每个单元格中可能有三种值。分别是0,1,2。
0表示这个格子为空,1表示这个格子有一个完好的苹果,2表示这个格子有一个腐烂的苹果。
腐烂的苹果每分钟会向上下左右四个方向的苹果传播一次病菌,并导致相邻的苹果腐烂。请问经过多少分钟,网格中不存在完好的苹果。如果有苹果永远不会腐烂则返回-1。
数据范围:1 n , m 100 , 网络中的值满足0 val 2
测试用例:
用例1
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4用例2
输入:[[2,1,1],[1,0,1],[1,1,1]]
输出:4
题目评价:
本人是最讨厌这种类型的题目,感觉特别麻烦(本人太菜了)。但这种题目的主流解法有两种:广度优先搜索(BFS)和 队列实现。
解题思路:
方法一(BFS):
首先分别将腐烂的橘子和新鲜的橘子保存在两个集合中;
模拟广度优先搜索的过程,方法是判断在每个腐烂橘子的四个方向上是否有新鲜橘子,如果有就腐烂它。每腐烂一次时间加 11,并剔除新鲜集合里腐烂的橘子;
当橘子全部腐烂时结束循环。
func orangesRotting(grid [][]int) int {if !hasFresh(grid) {return 0}time := getTimes(grid)if hasFresh(grid) {return -1}return time
}func hasFresh(grid [][]int) bool {for i := range grid {for _, val := range grid[i] {if 1 == val {return true}}}return false
}func getTimes(grid [][]int) int {q := getQueue(grid)time := 0for len(q) > 0 {next := make([][]int, 0)for i := range q {row := q[i][0]col := q[i][1]next = setRot(grid, next, row-1, col)next = setRot(grid, next, row, col+1)next = setRot(grid, next, row+1, col)next = setRot(grid, next, row, col-1)}if len(next) != 0 {time++}q = next}return time
}func getQueue(grid [][]int) [][]int {q := make([][]int, 0)for i := range grid {for j, val := range grid[i] {if 2 == val {q = append(q, []int{i, j})}}}return q
}func setRot(grid, q [][]int, row, col int) [][]int {if row < 0 || col < 0 || row >= len(grid) || col >= len(grid[0]) || grid[row][col] != 1 {return q}grid[row][col] = 2q = append(q, []int{row, col})return q
}
方法二( 队列实现):
// 位置结构体
type Pos struct {r,c int}// 队列
type Queue []Pos// 入队
func (this *Queue)Push(x Pos) {(*this) = append(*this,x)
}// 出队
func (this *Queue)Pop() Pos {res := (*this)[0](*this) = (*this)[1:len(*this)]return res
}// 判断队空
func (this Queue)IsEmpty() bool {if len(this) == 0 {return true}return false
}func orangesRotting(grid [][]int) int {res := -1n,m := len(grid),len(grid[0])dir := [][2]int{{1,0},{-1,0},{0,1},{0,-1}} // 方向矢量num1,num2 := 0,0 // 记录每一层腐烂橘子的数目flag := false // 记录初始状态下是否含有新鲜橘子var ql Queuefor i := 0; i < n; i++ {for j := 0; j < m; j++ {if grid[i][j] == 2 { // 把第一层腐烂橘子入队并计数ql.Push(Pos{i,j})num1++}if grid[i][j] == 1 {flag = true}}}if num1 == 0 { // 若没有腐烂的橘子结果取决于有无新鲜的橘子if flag {return -1}return 0}for !ql.IsEmpty() {now := ql.Pop()for i := 0; i < 4; i++ {r,c := now.r+dir[i][0],now.c+dir[i][1]if r >= 0 && r < n && c >= 0 && c < m && grid[r][c] == 1 {grid[r][c] = 2ql.Push(Pos{r,c})num2++}}num1--if num1 == 0 { // 遍历完一层就记一次数res++num1 = num2num2 = 0} }// 判断是否还有新鲜的橘子for i := 0; i < n; i++ {for j := 0; j < m; j++ {if grid[i][j] == 1 {return -1}}}return res
}
如果还是看不懂,可以看这个力扣网站上面的这道题目,相信对你有所帮助力扣https://leetcode.cn/problems/rotting-oranges/
go面试题 腐烂的苹果(橘子、水果)相关推荐
- 2014新浪校招笔试题:取水果(17年第一篇让人懵逼的面试题)
前言 2017 年,我还是会坚持每周一篇面试题,当然我每周看的面试题肯定是不止一篇的,我是在这周看过的面试题中,选择一题自己认为较好的来写.因为每一篇都写,不现实,写一篇博客,需要的时间也是挺长的,所 ...
- 2014新浪校招笔试题:取水果
2019独角兽企业重金招聘Python工程师标准>>> 题目 有任意种水果, 每种水果个数也是任意的, 两人轮流从中取出水果, 规则如下: 1) 每一次应取走至少一个水果; 每一次只 ...
- 水果手绘插画素材|一眼就想吃了!
不同风格的水果插画 在展现水果多面潜力的同时,也不断给大众带来惊喜 丰富的场景刻画出新潮.时尚的设计效果 一眼就想吃了! 奇异果猕猴桃新鲜切片果肉水果插画 牛油果鳄梨彩色手绘果壳水果插画 柠檬切片彩色 ...
- [转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍
参考链接: 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中 方法外 调 ...
- 《 Python List 列表全实例详解系列(八)》__随机列表元素
< Python List 列表全实例详解系列(八)> __随机列表元素 本章目录: 十.随机列表元素 方法1:random.shuffle 方法2:random.sample 十.随机列 ...
- 《数据库应用系统实践》------ 超市管理系统
系列文章 <数据库应用系统实践>------ 超市管理系统 文章目录 系列文章 一.需求分析 1.系统背景 2. 系统功能结构(需包含功能结构框图和模块说明) 3.系统功能简介 二.概念模 ...
- 【SQL怎么写】查询同一张表中同一个ID对应最新时间的数据记录
需求 同一张表中,怎么查询出同一个ID的最新记录,比如,某一个用户做过很多次修改,我只以最后一次提交记录为准,这时候是不是犯难了 1.数据准备 SET NAMES utf8mb4; SET FOREI ...
- Python继承、方法重写
继承 在编写类时,并不是每次都要从空白开始.当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率. class one():"" ...
- 设计模式——创建型设计模式
创建型设计模式 争对对象/类创建时的优化 工厂方法模式(了解) 通过定义顶层抽象工厂类,通过继承的方式,针对于每一个产品都提供一个工厂类用于创建. 情况:只适用于简单对象,当我们需要生产许多个产品族的 ...
最新文章
- 【124】排球基本技术
- matlab the installer cannot read,MATLAB安装 The installer cannot read the mwinstall.dll… | 学步园...
- java中的Attribute类_java培训技术ModelAttribute注解修饰POJO类型的入参
- pandas 空字符串与na区别_关于python:Pandas用空白/空字符串替换NaN
- 跨平台Unicode编程的一点问题
- Exchange系列之exchange2003sp2部署
- 抖音封禁超万账号;小米回应手机壳含毒;百度网盘封杀非官方版 | CSDN极客头条
- Tapestry5之多个方法匹配
- 关于Encode in UTF-8 without BOM
- 【xpghost】揭晓Windows 7快捷键的秘密
- JDK 8 函数式编程入门
- 计算机毕业论文个人小结2500字,毕业论文个人小结
- 巧用RoaringBitMap处理海量数据内存diff问题
- tp路由服务器无响应,路由器无法PPPOE链接上网老显示服务器无响应
- SQL语句oracle中如何插入Date类型的数据
- ios开发之autolayout 第三方框架Masonry
- 什么是分布式系统!以及分布式系统架构的优缺点
- 我是疫情期间的幸运儿
- 细细探究MySQL Group Replicaiton — 配置维护故障处理全集
- 元宇宙,真的是人类的“死路”吗?