Leetcode675. 为高尔夫比赛砍树:优先队列+广度优先找最短路径

2024-02-05 12:40

本文主要是介绍Leetcode675. 为高尔夫比赛砍树:优先队列+广度优先找最短路径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目连接

675. 为高尔夫比赛砍树

 题目描述

 

解题思路

当一个图给出来的时候,砍树路径就已经确定了,是根据树的高度进行排序的。那么每次的行走的起点和重点也就确定了,只需要计算从起点到重点的最小值即可。

第一步,遍历整个图,将所有有树的节点假如优先队列。

第二步,从(0,0)起点开始,逐步从优先队列中取点。

第三步,取出的两个点,通过广度优先算法,计算出长度,即可。

解题代码


import com.eclipsesource.json.JsonArray;import java.util.*;public class Solution675 {private List<List<Integer>> tr;private int x;private int y;public static List<List<Integer>> stringToInt2dList(String input) {JsonArray jsonArray = JsonArray.readFrom(input);if (jsonArray.size() == 0) {return new ArrayList<List<Integer>>();}List<List<Integer>> list = new ArrayList<>(jsonArray.size());for (int i = 0; i < jsonArray.size(); i++) {JsonArray cols = jsonArray.get(i).asArray();JsonArray jsonArray2 = JsonArray.readFrom(cols.toString());List<Integer> arr = new ArrayList<>(jsonArray2.size());for (int i1 = 0; i1 < jsonArray2.size(); i1++) {arr.add(jsonArray2.get(i1).asInt());}list.add(arr);}return list;}public static void main(String[] args) {List<List<Integer>> forest1 = stringToInt2dList("[[54581641,64080174,24346381,69107959]," +"[86374198,61363882,68783324,79706116]," +"[668150,92178815,89819108,94701471]," +"[83920491,22724204,46281641,47531096]," +"[89078499,18904913,25462145,60813308]]");List<List<Integer>> forest = stringToInt2dList("[[4,2,3]," +"[0,0,1]," +"[7,6,5]]");int ret = new Solution675().cutOffTree(forest);String out = String.valueOf(ret);System.out.print(out);}private int getMinLen(Pair pair1, Pair pair2) {boolean[][] view = new boolean[x][y];LinkedList<Pair> list = new LinkedList<>();list.add(pair1);int k = 0;while (!list.isEmpty()) {int i = 0;int l = list.size();while (i < l) {Pair p = list.pollFirst();i++;int x0 = p.xx;int y0 = p.yy;if (p.xx == pair2.xx && p.yy == pair2.yy) {return k;} else {if (x0 >= 0 && x0 < x && y0 >= 0 && y0 < y && !view[x0][y0] && tr.get(x0).get(y0) != 0) {Pair up = new Pair(x0 - 1, y0);Pair down = new Pair(x0 + 1, y0);Pair left = new Pair(x0, y0 - 1);Pair right = new Pair(x0, y0 + 1);list.addLast(up);list.addLast(down);list.addLast(left);list.addLast(right);view[x0][y0] = true;}}}k++;}return -1;}public int cutOffTree(List<List<Integer>> forest) {if (forest.get(0).get(0) == 0) {return -1;}this.tr = forest;int x = forest.size();int y = forest.get(0).size();this.x = x;this.y = y;PriorityQueue<Pair> queue = new PriorityQueue<>(new Comparator<Pair>() {@Overridepublic int compare(Pair o1, Pair o2) {return forest.get(o1.xx).get(o1.yy) - forest.get(o2.xx).get(o2.yy);}});for (int i = 0; i < x; i++) {for (int j = 0; j < y; j++) {if (forest.get(i).get(j) > 1) {queue.add(new Pair(i, j));}}}Pair start = new Pair(0, 0);int res = 0;while (!queue.isEmpty()) {Pair target = queue.poll();int dist = getMinLen(new Pair(start.xx, start.yy), new Pair(target.xx, target.yy));if (dist == -1) {return -1;}res += dist;System.out.println(start + "to" + target + dist);start = target;}return res;}
}class Pair {int xx;int yy;public Pair(int xx, int yy) {this.xx = xx;this.yy = yy;}@Overridepublic String toString() {return "Pair{" +"xx=" + xx +", yy=" + yy +'}';}
}

其中,json的解析依赖如下。

        <dependency><groupId>com.eclipsesource.minimal-json</groupId><artifactId>minimal-json</artifactId><version>0.9.5</version></dependency>

 解题结果

 

这篇关于Leetcode675. 为高尔夫比赛砍树:优先队列+广度优先找最短路径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680945

相关文章

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re