【力扣每日一题】力扣2846边权重均等查询

题目来源

力扣2846边权重均等查询

解题过程

思路一

刚开始看到这道题,注意到了是一个在树中找路径的问题,于是选择了把树当作图,来寻找两点之间的路径。(这里使用了DFS来找路径)

代码实现一

class Solution {private List<Route>[] adjacencyList;private int n;public int[] minOperationsQueries(int n, int[][] edges, int[][] queries) {this.n = n;// 建立并初始化邻接表this.adjacencyList = (List<Route>[]) new List<?>[n];for (int i = 0; i < n; i++) {adjacencyList[i] = new ArrayList<>();}for (int[] edge : edges) {adjacencyList[edge[0]].add(new Route(edge[1], edge[2]));adjacencyList[edge[1]].add(new Route(edge[0], edge[2]));}int[] answer = new int[queries.length];for (int i = 0; i < queries.length; i++) {int[] query = queries[i];int[] path = findPath(query[0],query[1]);int index = 1;// 使用哈希表保存距离及该距离在路径中出现次数映射Map<Integer, Integer> distancesMapCount = new HashMap<>();while (index < path.length && path[index] != -1) {List<Route> routes = adjacencyList[path[index - 1]];for (Route route : routes) {if (route.getDestination() == path[index]){int key = route.getDistance();distancesMapCount.put(key, distancesMapCount.getOrDefault(key, 0) + 1);break;}}index++;}// 总路径数-最多的距离次数就是需要调整的次数int sum = 0;int max = 0;for (Integer value : distancesMapCount.values()) {sum += value;max = Math.max(max, value);}answer[i] = sum - max;}return answer;}// 获取两点之间的路径private int[] findPath(int departure, int destination) {// 访问数组boolean[] visit = new boolean[this.n];// 路径数组int[] path = new int[this.n];int current = path[0] = departure;visit[current] = true;int length = dfs(current,destination,visit,path,1);for (;length < this.n; length++) {path[length] = -1;}return path;}// 深搜获取路径private int dfs(int current, int destination,boolean[] visit, int[] path, int length) {if (current == destination) {return length;}List<Route> routes = this.adjacencyList[current];for (Route route: routes) {int next = route.getDestination();if (!visit[next]) {visit[next] = true;path[length] = next;int temp = dfs(next, destination, visit, path, length + 1);if (temp != -1) {return temp;}}}return -1;}
}/*** 路由类*/
class Route{// 终点private int destination;// 距离private int distance;public Route(int destination, int distance) {this.destination = destination;this.distance = distance;}public int getDestination() {return destination;}public int getDistance() {return distance;}
}

结果一

结果超出了时间限制 ​编辑

思路二

后来想到,树节点之间的路径其实可以看成两个节点向上寻找公共祖先节点的过程。

代码实现二

class Solution {public int[] minOperationsQueries(int n, int[][] edges, int[][] queries) {TreeNode[] treeNodes = createTree(edges,n);// 寻找根节点TreeNode root = treeNodes[0];while (root.getParent() != null) {root = root.getParent();}setDepth(root,1);int[] answers = new int[queries.length];for (int i = 0; i < queries.length; i++) {int[] query = queries[i];Map<Integer, Integer> distanceMapCount = new HashMap<>();TreeNode shallow = treeNodes[query[0]];TreeNode deep = treeNodes[query[1]];// 调整两个节点深度一样if (shallow.getDepth() > deep.getDepth()) {TreeNode temp = shallow;shallow = deep;deep = temp;}while (deep.getDepth() > shallow.getDepth()) {int distance = deep.getToParentDistance();distanceMapCount.put(distance, distanceMapCount.getOrDefault(distance, 0) + 1);deep = deep.getParent();}// 同时向上寻找共同祖先节点while (deep != shallow){int distance = deep.getToParentDistance();distanceMapCount.put(distance, distanceMapCount.getOrDefault(distance, 0) + 1);distance = shallow.getToParentDistance();distanceMapCount.put(distance, distanceMapCount.getOrDefault(distance, 0) + 1);deep = deep.getParent();shallow = shallow.getParent();}int sum = 0;int max = 0;for (Integer value : distanceMapCount.values()) {sum += value;max = Math.max(max,value);}answers[i] = sum - max;}return answers;}// 设置每个节点的深度private void setDepth(TreeNode parent, int depth) {if (parent.getChildren().size() == 0) {return;}for (TreeNode child : parent.getChildren()) {child.setDepth(depth);setDepth(child, depth + 1);}}// 建立树private TreeNode[] createTree(int[][] edges, int nodeCount) {TreeNode[] treeNodes = new TreeNode[nodeCount];for (int i = 0; i < nodeCount; i++) {treeNodes[i] = new TreeNode(i);}for (int i = 0; i < edges.length;i++) {int point1 = edges[i][0];int point2 = edges[i][1];if (treeNodes[point2].getParent() == null) {treeNodes[point2].setParent(treeNodes[point1]);treeNodes[point1].getChildren().add(treeNodes[point2]);treeNodes[point2].setToParentDistance(edges[i][2]);;}else {treeNodes[point1].setParent(treeNodes[point2]);treeNodes[point2].getChildren().add(treeNodes[point1]);treeNodes[point1].setToParentDistance(edges[i][2]);;}}return treeNodes;}}/***树类*/
class TreeNode{// 父节点private TreeNode parent;// 节点数据private int point;// 到父节点的边权重private int toParentDistance;// 孩子节点private List<TreeNode> children;// 深度private int depth;public TreeNode(int point) {this.parent = null;this.point = point;this.children = new ArrayList<>();this.depth = 0;}public int getToParentDistance() {return toParentDistance;}public void setToParentDistance(int toParentDistance) {this.toParentDistance = toParentDistance;}public int getDepth() {return depth;}public void setDepth(int depth) {this.depth = depth;}public void setParent(TreeNode parent) {this.parent = parent;}public TreeNode getParent() {return parent;}public int getPoint() {return point;}public List<TreeNode> getChildren() {return children;}
}

结果二

还是超出了时间限制 ​编辑

总结

或许在构建树的时候进行旋转,最终把树构建成平衡树结果会好一点。 最后看了官方答案,要使用到Tarjan算法,这个算法没有听说过,目前还没有时间,后面有空再进行学习吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五、RHCE--NFS服务器

五、RHCE--NFS服务器 1、简介2、nfs配置3、配置autofs自动挂载1、简介 NFS(Network File System,网络文件系统)是FreeBSD支持的文件系统中的一种,它允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上使用。在NFS的…

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法 0.写在前面00.电脑配置01.思路 1.VisualSVN Server下载安装01.下载02.安装03.电脑命名不能有中文04.制作VisualSVN Server快捷方式05.License limits exceeded, Som…

二分图 染色法 + 匈牙利算法

染色法判断二分图 const int N 1e5 10, M 2 * N;int e[M], ne[M], h[N], n, m, idx 0, color[N]; void add(int a, int b){e[idx] b; ne[idx] h[a]; h[a] idx;}bool dfs(int u, int c) {color[u] c; // 染色该点for(int i h[u]; i ! -1; i ne[i]){int j …

仅用2天就备案完成了,这速度也太快了...

引言 大家好&#xff0c;就在前天&#xff0c;笔者才发布了文章《时隔78天&#xff0c;个人微信小游戏内容审核终于通过了&#xff0c;这到底是经历了什么…》。 感慨了游戏内容审核的不容易&#xff0c;同时简单介绍了备案的流程。 没想到申请备案才2天&#xff0c;就已经过…

如何对高并发系统进行压力测试?重要参数详解

前言 大家好&#xff0c;我是chowley&#xff0c;今天来介绍一下——高并发系统下的压力测试 本文将深入探讨如何对高并发系统进行压力测试&#xff0c;重点解析压力测试中的关键参数。 压力测试 在当今的软件开发领域中&#xff0c;高并发系统的性能至关重要的。为确保系统…

TongWeb8交流常见问答集

问题1&#xff1a;今后用到你们TongWeb产品该联系谁&#xff1f; 答复&#xff1a; 1. 商务问题&#xff0c;如&#xff1a;报价、license授权、合同等请联系销售。 2. TongWeb技术问题&#xff0c;未签项目联系售前&#xff0c;已签项目联系售后。有指定项目经理的项目&…

【EI会议征稿】第三届大数据、区块链与经济管理国际学术会议 (ICBBEM 2024)

第三届大数据、区块链与经济管理国际学术会议 (ICBBEM 2024) The 3rd International Conference on Bigdata Blockchain and Economy Management 第三届大数据、区块链与经济管理国际学术会议(ICBBEM 2024)&#xff0c;将于2024年3月22-24日在中国南昌召开。大会由江西科技师…

2023年衣物清洁赛道行业数据分析(电商数据查询):总销额同比下滑21%

衣物清洁产品是日常生活中的必备消费品&#xff0c;加之消费频次较高&#xff0c;因此在我国较大的人口基数背景下&#xff0c;衣物清洁市场的整体体量也比较大。不过&#xff0c;从年度的销售走势看&#xff0c;2023年衣物清洁市场的整体销售呈现一定幅度的下滑。 根据鲸参谋…

深入浅出 diffusion(2):pytorch 实现 diffusion 加噪过程

我在上篇博客深入浅出 diffusion&#xff08;1&#xff09;&#xff1a;白话 diffusion 原理&#xff08;无公式&#xff09;中介绍了 diffusion 的一些基本原理&#xff0c;其中谈到了 diffusion 的加噪过程&#xff0c;本文用pytorch 实现下到底是怎么加噪的。 import torch…

Oracle篇—分区表和分区索引的介绍和分类(第一篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

教培行业的手机软件应该有哪些功能

DT浏览器是一款面向教育行业的手机软件&#xff0c;主要有网络搜索、资料收藏&#xff08;可分类和排序&#xff0c;只有DT浏览器有这个功能&#xff09;、人工智能写作、人工智能知识问答、内部交流&#xff08;功能比某信强大&#xff0c;自己管理&#xff0c;自由度高&#…

shell监控目录下新增的文件并进行处理

用户每天上传文件到指定目录&#xff0c;通过shell脚本尽快识别到新上传的文件已经上传完成&#xff0c;然后就处理新上传的文件。 通过ls记录文件名列表到临时文件中&#xff0c;然后通过diff比较识别新增的文件&#xff1b; 通过文件的大小变化判断新增文件是否上传完成&…

金蝶云星空—开发直接SQL报表

项目场景&#xff1a; 金蝶云星空报表开发 问题描述 金蝶云星空直接SQL开发不需要些代码&#xff0c;只通过SQL脚本即可开发 解决方案&#xff1a; 步骤如下&#xff1a; 步骤一&#xff1a; 打开BOSS开发平台&#xff0c;打开 -》财务会计 -》总账 -》账表 -》直接SQL账表…

C语言的模型玩具:结构体的使用以及操作符优先级

各位少年&#xff0c;大家好&#xff0c;我是博主那一脸阳光&#xff0c;今天分享结构体的使用&#xff0c;声明以及操作符的使用。 前言&#xff1a; 如果你想做一块月饼&#xff0c;你要学习它的制作方法&#xff0c;需要准备面粉&#xff0c;白砂糖&#xff0c;奶粉&…

构建未来学堂:在线教育系统开发技术实践

在当今数字化时代&#xff0c;在线教育系统的开发越发显得至关重要。本文将带你深入了解在线教育系统的开发&#xff0c;涉及到关键的技术实践和代码示例。我们将采用现代化技术栈&#xff0c;为未来学堂的搭建提供实用的指南。 技术栈选择 在开始实际的开发之前&#xff0c…

给编译好的so修改rpath为当前路径

这几天调整安装&#xff0c;发现有些文件安装到/lib下。就想复制到安装目录&#xff0c;这样影响更少。然后发现rpath有问题。怎么办&#xff1f;修改为当前路径最好。 当前路径的两种表示方法 .或者$ORIGIN NEW_RPATH.:/usr/local/lib/:/lib/aarch64-linux-gnu/ NEW_RPATH\…

openssl3.2/test/certs - 069 - www.bad.net excluded by parent CA.

文章目录 openssl3.2/test/certs - 069 - www.bad.net excluded by parent CA.概述笔记END openssl3.2/test/certs - 069 - www.bad.net excluded by parent CA. 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev\my_local_git_prj\study\openSS…

RX4901CE (RTC模块)

RX4901CE是一个集成了32.768 kHz数字温度补偿晶体振荡器(DTCXO)的RTC模块。高稳定性&#xff0c;低电流消耗&#xff0c;时间戳功能&#xff0c;当外部或内部事件发生时&#xff0c;可以记录多达32个日期和时间&#xff0c;以及基本的RTC功能&#xff0c;如时间和日历&#xff…

Backtrader 文档学习-Order OCO orders

Backtrader 文档学习-Order OCO orders 主要是可以使用订单组的管理策略&#xff0c;使用订单组策略&#xff0c;则一组订单中&#xff0c;有一个符合条件的订单成交&#xff0c;订单组中其他的订单就自动被取消。 1.概述 V1.9.36.116 版本交互式代理支持StopTrail、StopTra…

Spring复习更新中

Spring复习更新中 Bean的生命周期SpringIoc(Inversion of Control)注解 SpringBootSpringMVCSpringCloud 更新中ing JVM/GC复习已更新完 Bean的生命周期 五步 第一步&#xff1a;实例化Bean第二步&#xff1a;Bean属性赋值第三步&#xff1a;初始化Bean第四步&#xff1a;使用…