2024.3.5力扣每日一题——到达目的地的方案数

2024.3.5

      • 题目来源
      • 我的题解
        • 方法一 深度优先遍历(超时)
        • 方法二 最短路径算法(Dijkstra 算法)+优先队列

题目来源

力扣每日一题;题序:1976

我的题解

方法一 深度优先遍历(超时)

从节点0开始进行深度优先遍历,直到遍历到节点n-1结束,遍历过程记录路径和。

时间复杂度:O(E+m)。E表示边数,m表示节点数
空间复杂度:O(m+E)

TreeMap<Long,Long> map=new TreeMap<>();
public int countPaths(int n, int[][] roads) {List<Integer>[] g=createGraph(n,roads);boolean[] visited=new boolean[n];visited[0]=true;dfs(g,0,-1,0,visited,n);return (int)(map.firstEntry().getValue()%1000000007);}
//构建图
public List<Integer>[] createGraph(int n,int[][] edges){List<Integer>[] g=new ArrayList[n];for(int i=0;i<n;i++){g[i]=new ArrayList<>();}for(int[] t:edges){int from = t[0];int to = t[1];int weight = t[2];g[from].add(to);g[from].add(weight);g[to].add(from);g[to].add(weight);}return g;
}
//深度优先遍历
public void dfs(List<Integer>[] g,int cur,int pre,long count,boolean[] visited,int n){if(cur==n-1)map.put(count,map.getOrDefault(count,0L)+1);for(int i=0;i<g[cur].size();i+=2){int next=g[cur].get(i);int weight=g[cur].get(i+1);if(!visited[next]){visited[next]=true;dfs(g,next,cur,count+weight,visited,n);visited[next]=false;}}
}
方法二 最短路径算法(Dijkstra 算法)+优先队列

具体的实现可以看官方题解,我有点没看明白
传统的Dijkstra 算法可以求得两个节点之间的最短路径,但是本题要求求出和最短路径长度相同的路径数。因此,需要对Dijkstra算法进行一些优化。
观察优先队列实现的「Dijkstra 算法」,有以下数据结构:

  • e是邻接表,这道题中需要我们自己根据 roads 创建。
  • q 是优先队列,元素是路径长度和点的编号。不停往外抛出队列中的最短路径和点。如果这个点是未被确定最短路径的点,那么这次出队列的操作,就将确定源到这个点的最短路径。然后依次访问这个点相邻的点,判断从这个点到相邻的点的路径,是否能刷新源相邻点的最短路径,如果能,则将路径长度和相邻点放入队列。
  • dis 用来记录源到各个点当前最短路径的长度。会在访问当前出队列点的相邻点的过程中被刷新。
  • vis用来记录哪些点的最短路径已经被确定。在这里略显多余,可以用当前出队列的路径长度和点的最短路径的比较来代替。

除此之外,还需要一个新的数组 ways。ways[v] 就表示源到点 v最短的路径数目,且最短路径长度为 dis[v]。 ways的更新时机与 dis 相同。在访问当前点 u 的各个相邻点 v 时,

  • 如果从点 u 到点 v 路径,能刷新 dis[v],则更新 dis[v],并将 ways[v] 更新为 ways[u],表示有多少条源到点 u 的最短路径,就有多少条源到点 v的最短路径。
  • 如果从点 u 到点 v 路径,与 dis[v]相等。那么 ways[v] 的值要加上 ways[u],表示点 u 到点 v 路径贡献了另一部分源到点 v 的最短路径。
  • 如果从点 u 到点 v 路径,大于 dis[v]。那么无需操作 dis[v]。

时间复杂度:O(mlogm)
空间复杂度:O(m)

public int countPaths(int n, int[][] roads) {int mod = 1000000007;List<int[]>[] e = new List[n];for (int i = 0; i < n; i++) {e[i] = new ArrayList<int[]>();}//构建图for (int[] road : roads) {int x = road[0], y = road[1], t = road[2];e[x].add(new int[]{y, t});e[y].add(new int[]{x, t});}// 节点0到每个节点的距离long[] dis = new long[n];Arrays.fill(dis, Long.MAX_VALUE);//表示源到其他节点的最短的路径数目,且最短路径长度为 disint[] ways = new int[n];//使用PriorityQueue<long[]> pq = new PriorityQueue<long[]>((a, b) -> Long.compare(a[0], b[0]));pq.offer(new long[]{0, 0});//到本身的距离为0dis[0] = 0;//只有一个节点ways[0] = 1;while (!pq.isEmpty()) {long[] arr = pq.poll();long t = arr[0];int u = (int) arr[1];//如果当前堆顶的距离大于现有节点位置,不用更新if (t > dis[u]) {continue;}//for (int[] next : e[u]) {int v = next[0], w = next[1];if (t + w < dis[v]) {dis[v] = t + w;ways[v] = ways[u];pq.offer(new long[]{t + w, v});} else if (t + w == dis[v]) {ways[v] = (ways[u] + ways[v]) % mod;}}}return ways[n - 1];
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

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

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

相关文章

大模型论文阅读:ADAPTIVE BUDGET ALLOCATION FOR PARAMETEREFFICIENT FINE-TUNING

大模型论文阅读:ADAPTIVE BUDGET ALLOCATION FOR PARAMETEREFFICIENT FINE-TUNING 论文链接:https://arxiv.org/pdf/2303.10512v1.pdf 当存在大量下游任务时,微调所有预训练模型的参数变得不可行。因此,为了以参数高效的方式学习预训练权重的增量更新,提出了许多微调方法,…

【并发编程】CountDownLatch

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳中求进&#xff0c;晒太阳 CountDownLatch 概念 CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。 CountDownLatch 定义了一个计数器&#xff0c;…

Python大型数据集(GPU)可视化和Pillow解释性视觉推理及材料粒子凝聚

&#x1f3af;要点 P​y​t​ho​n​图像​处理Pillow​库​&#xff1a;&#x1f3af;打开图像、保存图像、保存期间的压缩方式、读取方法、创建缩略图、创建图像查看器。&#x1f3af;获取 RGB 值&#xff0c;从图像中获取颜色&#xff0c;更改像素颜色&#xff0c;转换为黑…

【每日一道算法题】移除链表节点

这里写自定义目录标题 【每日一道算法题】移除链表元素思路记录我的代码力扣官方题解递归迭代 【每日一道算法题】移除链表元素 力扣题目链接(opens new window) 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xf…

3459: 【PY】A+B问题

题目描述 在大部分的在线题库中&#xff0c;都会将AB问题作为第一题&#xff0c;以帮助新手熟悉平台的使用方法。 AB问题的题目描述如下&#xff1a;给定两个整数A和B&#xff0c;输出AB的值。 现在请你解决这一问题。 输入 第一行一个整数&#xff0c;表示A 第二行一个整…

arm的状态寄存器

目录 一、arm 的 PSRs二、CPSR2.1 CPSR_cxsf 三、SPSR四、APSR 一、arm 的 PSRs arm 中有很多程序状态寄存器&#xff08;Program Status Registers&#xff0c;PSRs&#xff09;用于存储处理器的状态信息&#xff0c;包括 CPSR\SPSR\FPSR\APSR 等&#xff1a; CPSR&#xff…

Vue3配置router路由步骤

Vue3配置router路由步骤 首先创建一个vue3的项目 先检查一下router的版本&#xff0c;可以在pakage.json里面查看&#xff0c;也可以你直接在终端输入 npm list vue-router如果版本比较低的话&#xff0c;先升级一下 vue3的话&#xff0c;用以下命令 npm install vue-route…

红蓝色WordPress外贸建站模板

红蓝色WordPress外贸建站模板 https://www.mymoban.com/wordpress/5.html

TSINGSEE青犀推出河道/河湖/水域治理视频AI智能解决方案

一、方案背景 “十四五”时期&#xff0c;在面源污染防治等方面实现突破&#xff0c;实现主要水污染排放总量持续减少&#xff0c;水生态环境持续改善等任务艰巨。进一步完善流域综合治理体系&#xff0c;提升流域水环境综合治理能力和水平&#xff0c;更好适应新阶段发展需求…

verilog 从入门到看得懂---verilog 结构说明语句

verilog语言中的过程块都是由一下四个结构语句构成&#xff1a; 1&#xff09;initial说明语句(只执行一次) 2&#xff09;always说明语句&#xff08;敏感参数触发的时候调用&#xff09; 3&#xff09;task说明语句&#xff08;调用的时候执行&#xff09; 4&#xff09;…

【Java基础】Java的反射、注解、lambda表达式

文章目录 1. 反射1.1 反射演示1.2 反射原理 2. Class类3. 注解3.1 内置注解3.2 元注解3.3 自定义注解 4. lambda表达式5. lambda精简6. lambda调用方法 1. 反射 1.1 反射演示 有一个猫类&#xff0c;如下&#xff1a; public class Cat {private String name;private int ag…

IDEA2023.1.1中文插件

1.启动IDEA 选中Customize 2.选择All settings 3.选中Plugins,再搜索栏里输入Chinese,找到 "Chinese (Simplified) Language"插件&#xff0c;点击 Install 进行安装。 4. 安装完成后&#xff0c;重启IntelliJ IDEA&#xff0c;即可看到界面语言已经变为中文。

JavaScript 函数定义和调用

在JavaScript中&#xff0c;定义函数的方式如下&#xff1a; function abs(x) { if (x > 0) { return x; } else { return -x; } } 上述abs()函数的定义如下&#xff1a; function指出这是一个函数定义&#xff1b; abs是函数的名称&#xff1b; (x)括号内列出函数的参数&am…

Springboot 集成 dynamic-datasource-spring-boot-starter,实现项目中原有的数据源作为主数据源

Springboot 集成 dynamic-datasource-spring-boot-starter&#xff0c;实现项目中原有的数据源作为主数据源 保证原有项目中在执行数据库操作时&#xff0c;默认使用原有数据源&#xff0c;新数据源做特定操作 引入多数据源切换依赖&#xff1a; <dependency><grou…

JavaScript(一)基础

文章目录 一、JS介绍JavaScript是什么JavaScript书写位置JavaScript的注释输入输出语法字面量 二、变量变量是什么变量基本使用变量的本质变量命名规则与规范变量拓展-数组var与let的区别 三、常量四、数据类型数据类型检测数据类型数据类型转换隐式转换显式转换 简单运算符断点…

【洛谷 P8695】[蓝桥杯 2019 国 AC] 轨道炮 题解(映射+模拟+暴力枚举+桶排序)

[蓝桥杯 2019 国 AC] 轨道炮 题目描述 小明在玩一款战争游戏。地图上一共有 N N N 个敌方单位&#xff0c;可以看作 2D 平面上的点。其中第 i i i 个单位在 0 0 0 时刻的位置是 ( X i , Y i ) (X_i, Y_i) (Xi​,Yi​)&#xff0c;方向是 D i D_i Di​ (上下左右之一, 用…

【详细注释+流程讲解】基于深度学习的文本分类 TextCNN

前言 这篇文章用于记录阿里天池 NLP 入门赛&#xff0c;详细讲解了整个数据处理流程&#xff0c;以及如何从零构建一个模型&#xff0c;适合新手入门。 赛题以新闻数据为赛题数据&#xff0c;数据集报名后可见并可下载。赛题数据为新闻文本&#xff0c;并按照字符级别进行匿名…

同步检查继电器 JT-1/200 100V 面板嵌入式安装,板后接线

系列型号 JT-1同步检查继电器&#xff1b; DT-1同步检查继电器&#xff1b; JT-3同步检查继电器&#xff1b; DT-3同步检查继电器&#xff1b; 一、应用范围 JT(DT)系列同步检查继电器用于两端供电线路的自动重合闸线路中&#xff0c;以检查线路上电压的存在及线路上和变电站汇…

基于Spring Boot的在线考试系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Go语言时间编程

1.时间元素编程 时间是一个重要的编程元素,可用于计算、同步服务器以及测量。Go语言标准库提供了time包,其中包含用于同当前时间交互以及测量时间的函数和方法。 在编程中,时间通常被称为“实时” “过去的时间” 和 “壁挂钟” 。对于术语“壁挂钟”,可将其视为挂在墙上的…