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

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1