LeetCode 787. K 站中转内最便宜的航班
题目描述
有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。
示例 1:
输入:
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 1
输出: 200
LeetCode 787. K 站中转内最便宜的航班
提示:
1 <= n <= 100
0 <= flights.length <= (n * (n - 1) / 2)
flights[i].length == 3
0 <= fromi, toi < n
fromi != toi
1 <= pricei <= 104
航班没有重复,且不存在自环
0 <= src, dst, k < n
src != dst
一、解题关键词
求最值、从特定位置开始初始化动态规划初始值
二、解题报告
1.思路分析
2.时间复杂度
3.代码示例
class Solution {
public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
final int INF = 10000 * 101 + 1;
int [] dp = new int[n];
Arrays.fill(dp,INF);
dp[src] = 0;
int ans = INF;
for(int i = 1; i <= k + 1; i++){
int [] dp2 = new int[n];
Arrays.fill(dp2,INF);
for(int[] fight : flights){
int j = fight[0],l = fight[1],cost = fight[2];
dp2[l] = Math.min(dp2[l],dp[j] + cost);
}
dp = dp2;
ans = Math.min(ans,dp[dst]);
}
return ans == INF ? -1 : ans;
}
}
方法二
public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
int len = flights.length;
//最值 找到重复的集合 贪心思想
final int INF = 10000 * 101 +1;
int [][] dp = new int[k + 2][n];
for(int i = 0;i < k + 2; i++){
Arrays.fill(dp,INF);
}
dp[0][src] = 0;
for(int j = 1; j <= k + 1;j++){
for(int[] flight : flights){
int l = flight[0],i = flight[1],cost = flight[2];
dp[j][i] = Math.min(dp[j][i],dp[j - 1][l] + cost);
}
}
int ans = INF;
for(int i = 1; i < k + 2;i++){
ans = Math.min(ans,dp[i][dst]);
}
return ans == INF ? -1 :ans;
}
2.知识点