2045:到达目的地的第二短时间
This commit is contained in:
parent
964bf4c7b6
commit
a09e96a85c
6
pom.xml
6
pom.xml
@ -25,6 +25,12 @@
|
||||
<artifactId>hutool-all</artifactId>
|
||||
<version>5.7.17</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>RELEASE</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
|
@ -0,0 +1,138 @@
|
||||
//城市用一个 双向连通 图表示,图中有 n 个节点,从 1 到 n 编号(包含 1 和 n)。图中的边用一个二维整数数组 edges 表示,其中每个
|
||||
//edges[i] = [ui, vi] 表示一条节点 ui 和节点 vi 之间的双向连通边。每组节点对由 最多一条 边连通,顶点不存在连接到自身的边。穿过任意一条边的时
|
||||
//间是 time 分钟。
|
||||
//
|
||||
// 每个节点都有一个交通信号灯,每 change 分钟改变一次,从绿色变成红色,再由红色变成绿色,循环往复。所有信号灯都 同时 改变。你可以在 任何时候 进入
|
||||
//某个节点,但是 只能 在节点 信号灯是绿色时 才能离开。如果信号灯是 绿色 ,你 不能 在节点等待,必须离开。
|
||||
//
|
||||
// 第二小的值 是 严格大于 最小值的所有值中最小的值。
|
||||
//
|
||||
//
|
||||
// 例如,[2, 3, 4] 中第二小的值是 3 ,而 [2, 2, 4] 中第二小的值是 4 。
|
||||
//
|
||||
//
|
||||
// 给你 n、edges、time 和 change ,返回从节点 1 到节点 n 需要的 第二短时间 。
|
||||
//
|
||||
// 注意:
|
||||
//
|
||||
//
|
||||
// 你可以 任意次 穿过任意顶点,包括 1 和 n 。
|
||||
// 你可以假设在 启程时 ,所有信号灯刚刚变成 绿色 。
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
// 示例 1:
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//输入:n = 5, edges = [[1,2],[1,3],[1,4],[3,4],[4,5]], time = 3, change = 5
|
||||
//输出:13
|
||||
//解释:
|
||||
//上面的左图展现了给出的城市交通图。
|
||||
//右图中的蓝色路径是最短时间路径。
|
||||
//花费的时间是:
|
||||
//- 从节点 1 开始,总花费时间=0
|
||||
//- 1 -> 4:3 分钟,总花费时间=3
|
||||
//- 4 -> 5:3 分钟,总花费时间=6
|
||||
//因此需要的最小时间是 6 分钟。
|
||||
//
|
||||
//右图中的红色路径是第二短时间路径。
|
||||
//- 从节点 1 开始,总花费时间=0
|
||||
//- 1 -> 3:3 分钟,总花费时间=3
|
||||
//- 3 -> 4:3 分钟,总花费时间=6
|
||||
//- 在节点 4 等待 4 分钟,总花费时间=10
|
||||
//- 4 -> 5:3 分钟,总花费时间=13
|
||||
//因此第二短时间是 13 分钟。
|
||||
//
|
||||
//
|
||||
// 示例 2:
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//输入:n = 2, edges = [[1,2]], time = 3, change = 2
|
||||
//输出:11
|
||||
//解释:
|
||||
//最短时间路径是 1 -> 2 ,总花费时间 = 3 分钟
|
||||
//最短时间路径是 1 -> 2 -> 1 -> 2 ,总花费时间 = 11 分钟
|
||||
//
|
||||
//
|
||||
//
|
||||
// 提示:
|
||||
//
|
||||
//
|
||||
// 2 <= n <= 10⁴
|
||||
// n - 1 <= edges.length <= min(2 * 10⁴, n * (n - 1) / 2)
|
||||
// edges[i].length == 2
|
||||
// 1 <= ui, vi <= n
|
||||
// ui != vi
|
||||
// 不含重复边
|
||||
// 每个节点都可以从其他节点直接或者间接到达
|
||||
// 1 <= time, change <= 10³
|
||||
//
|
||||
// Related Topics 广度优先搜索 图 最短路 👍 46 👎 0
|
||||
|
||||
package leetcode.editor.cn;
|
||||
|
||||
import com.code.leet.entiy.TwoArray;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
//2045:到达目的地的第二短时间
|
||||
public class SecondMinimumTimeToReachDestination {
|
||||
public static void main(String[] args) {
|
||||
Solution solution = new SecondMinimumTimeToReachDestination().new Solution();
|
||||
// TO TEST
|
||||
TwoArray twoArray = new TwoArray("[[1,2],[1,3],[1,4],[3,4],[4,5]]", true);
|
||||
System.out.println(solution.secondMinimum(5, twoArray.getArr(), 3, 5));
|
||||
}
|
||||
|
||||
//leetcode submit region begin(Prohibit modification and deletion)
|
||||
class Solution {
|
||||
public int secondMinimum(int n, int[][] edges, int time, int change) {
|
||||
Map<Integer, List<Integer>> map = new HashMap<>(n);
|
||||
for (int i = 1; i <= n; i++) {
|
||||
map.put(i, new ArrayList<>());
|
||||
}
|
||||
for (int[] edge : edges) {
|
||||
map.get(edge[0]).add(edge[1]);
|
||||
map.get(edge[1]).add(edge[0]);
|
||||
}
|
||||
Queue<int[]> queue = new LinkedList<>();
|
||||
queue.add(new int[]{1, 0});
|
||||
int[] counts = new int[n + 1];
|
||||
while (!queue.isEmpty()) {
|
||||
int[] arrs = queue.peek();
|
||||
int free = arrs[1] + time;
|
||||
if ((arrs[1] / change) % 2 == 1) {
|
||||
free += change - arrs[1] % change;
|
||||
}
|
||||
int size = queue.size();
|
||||
boolean bl = true;
|
||||
boolean[] use = new boolean[n + 1];
|
||||
for (int i = 0; i < size; i++) {
|
||||
arrs = queue.poll();
|
||||
List<Integer> list = map.get(arrs[0]);
|
||||
for (int num : list) {
|
||||
if (!use[num] && counts[num] < 2) {
|
||||
queue.add(new int[]{num, free});
|
||||
use[num] = true;
|
||||
counts[num]++;
|
||||
}
|
||||
if (num == n && bl) {
|
||||
bl = false;
|
||||
if (counts[num] == 2) {
|
||||
return free;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
//leetcode submit region end(Prohibit modification and deletion)
|
||||
|
||||
}
|
@ -0,0 +1,72 @@
|
||||
<p>城市用一个 <strong>双向连通</strong> 图表示,图中有 <code>n</code> 个节点,从 <code>1</code> 到 <code>n</code> 编号(包含 <code>1</code> 和 <code>n</code>)。图中的边用一个二维整数数组 <code>edges</code> 表示,其中每个 <code>edges[i] = [u<sub>i</sub>, v<sub>i</sub>]</code> 表示一条节点 <code>u<sub>i</sub></code> 和节点 <code>v<sub>i</sub></code> 之间的双向连通边。每组节点对由 <strong>最多一条</strong> 边连通,顶点不存在连接到自身的边。穿过任意一条边的时间是 <code>time</code> 分钟。</p>
|
||||
|
||||
<p>每个节点都有一个交通信号灯,每 <code>change</code> 分钟改变一次,从绿色变成红色,再由红色变成绿色,循环往复。所有信号灯都 <strong>同时</strong> 改变。你可以在 <strong>任何时候</strong> 进入某个节点,但是 <strong>只能</strong> 在节点 <strong>信号灯是绿色时</strong> 才能离开。如果信号灯是 <strong>绿色</strong> ,你 <strong>不能</strong> 在节点等待,必须离开。</p>
|
||||
|
||||
<p><strong>第二小的值</strong> 是 <strong>严格大于</strong> 最小值的所有值中最小的值。</p>
|
||||
|
||||
<ul>
|
||||
<li>例如,<code>[2, 3, 4]</code> 中第二小的值是 <code>3</code> ,而 <code>[2, 2, 4]</code> 中第二小的值是 <code>4</code> 。</li>
|
||||
</ul>
|
||||
|
||||
<p>给你 <code>n</code>、<code>edges</code>、<code>time</code> 和 <code>change</code> ,返回从节点 <code>1</code> 到节点 <code>n</code> 需要的 <strong>第二短时间</strong> 。</p>
|
||||
|
||||
<p><strong>注意:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li>你可以 <strong>任意次</strong> 穿过任意顶点,<strong>包括</strong> <code>1</code> 和 <code>n</code> 。</li>
|
||||
<li>你可以假设在 <strong>启程时</strong> ,所有信号灯刚刚变成 <strong>绿色</strong> 。</li>
|
||||
</ul>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<p><img alt="" src="https://assets.leetcode.com/uploads/2021/09/29/e1.png" style="width: 200px; height: 250px;" /> <img alt="" src="https://assets.leetcode.com/uploads/2021/09/29/e2.png" style="width: 200px; height: 250px;" /></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>n = 5, edges = [[1,2],[1,3],[1,4],[3,4],[4,5]], time = 3, change = 5
|
||||
<strong>输出:</strong>13
|
||||
<strong>解释:</strong>
|
||||
上面的左图展现了给出的城市交通图。
|
||||
右图中的蓝色路径是最短时间路径。
|
||||
花费的时间是:
|
||||
- 从节点 1 开始,总花费时间=0
|
||||
- 1 -> 4:3 分钟,总花费时间=3
|
||||
- 4 -> 5:3 分钟,总花费时间=6
|
||||
因此需要的最小时间是 6 分钟。
|
||||
|
||||
右图中的红色路径是第二短时间路径。
|
||||
- 从节点 1 开始,总花费时间=0
|
||||
- 1 -> 3:3 分钟,总花费时间=3
|
||||
- 3 -> 4:3 分钟,总花费时间=6
|
||||
- 在节点 4 等待 4 分钟,总花费时间=10
|
||||
- 4 -> 5:3 分钟,总花费时间=13
|
||||
因此第二短时间是 13 分钟。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<p><img alt="" src="https://assets.leetcode.com/uploads/2021/09/29/eg2.png" style="width: 225px; height: 50px;" /></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>n = 2, edges = [[1,2]], time = 3, change = 2
|
||||
<strong>输出:</strong>11
|
||||
<strong>解释:</strong>
|
||||
最短时间路径是 1 -> 2 ,总花费时间 = 3 分钟
|
||||
最短时间路径是 1 -> 2 -> 1 -> 2 ,总花费时间 = 11 分钟</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>2 <= n <= 10<sup>4</sup></code></li>
|
||||
<li><code>n - 1 <= edges.length <= min(2 * 10<sup>4</sup>, n * (n - 1) / 2)</code></li>
|
||||
<li><code>edges[i].length == 2</code></li>
|
||||
<li><code>1 <= u<sub>i</sub>, v<sub>i</sub> <= n</code></li>
|
||||
<li><code>u<sub>i</sub> != v<sub>i</sub></code></li>
|
||||
<li>不含重复边</li>
|
||||
<li>每个节点都可以从其他节点直接或者间接到达</li>
|
||||
<li><code>1 <= time, change <= 10<sup>3</sup></code></li>
|
||||
</ul>
|
||||
<div><div>Related Topics</div><div><li>广度优先搜索</li><li>图</li><li>最短路</li></div></div><br><div><li>👍 46</li><li>👎 0</li></div>
|
Loading…
Reference in New Issue
Block a user