算法题 |
算法刷题专栏 | 面试必备算法 | 面试高频算法
越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
作者简介:硕风和炜,CSDN-Java领域新星创作者,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享
恭喜你发现一枚宝藏博主,赶快收入囊中吧
人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?
算法题 |
给你一个下标从 0 开始的整数矩阵 grid ,矩阵大小为 m x n ,由从 0 到 m * n - 1 的不同整数组成。你可以在此矩阵中,从一个单元格移动到 下一行 的任何其他单元格。如果你位于单元格 (x, y) ,且满足 x < m - 1 ,你可以移动到 (x + 1, 0), (x + 1, 1), …, (x + 1, n - 1) 中的任何一个单元格。注意: 在最后一行中的单元格不能触发移动。
每次可能的移动都需要付出对应的代价,代价用一个下标从 0 开始的二维数组 moveCost 表示,该数组大小为 (m * n) x n ,其中 moveCost[i][j] 是从值为 i 的单元格移动到下一行第 j 列单元格的代价。从 grid 最后一行的单元格移动的代价可以忽略。
grid 一条路径的代价是:所有路径经过的单元格的 值之和 加上 所有移动的 代价之和 。从 第一行 任意单元格出发,返回到达 最后一行 任意单元格的最小路径代价。
示例 1:
输入:grid = [[5,3],[4,0],[2,1]], moveCost = [[9,8],[1,5],[10,12],[18,6],[2,4],[14,3]]
输出:17
解释:最小代价的路径是 5 -> 0 -> 1 。
输入:grid = [[5,1,2],[4,0,3]], moveCost = [[12,10,15],[20,23,8],[21,7,1],[8,1,13],[9,10,25],[5,3,2]]
输出:6
解释:
最小代价的路径是 2 -> 3 。
提示:
m == grid.length
n == grid[i].length
2 <= m, n <= 50
grid 由从 0 到 m * n - 1 的不同整数组成
moveCost.length == m * n
moveCost[i].length == n
1 <= moveCost[i][j] <= 100
class Solution {
public int minPathCost(int[][] grid, int[][] moveCost) {
int m=grid.length,n=grid[0].length;
int[][] map=new int[m*n+2][m*n+2];
for(int i=0;i<map.length;i++) Arrays.fill(map[i],Integer.MAX_VALUE/2);
int start=m*n;
for(int j=0;j<n;j++){
int to=grid[0][j];
map[start][to]=0+to;
}
for(int i=0;i<m-1;i++){
for(int j=0;j<n;j++){
int from=grid[i][j];
for(int k=0;k<n;k++){
int to=grid[i+1][k];
map[from][to]=moveCost[from][k]+to;
}
}
}
for(int j=0;j<n;j++){
int from=grid[m-1][j];
map[from][n*m+1]=0;
}
int[] ans=dijkstra(grid,map,moveCost,start);
for(int v:ans){
System.out.println(v);
}
return ans[n*m+1];
}
public int[] dijkstra(int[][] grid,int[][] map,int[][] moveCost,int start){
int m=grid.length,n=grid[0].length;
PriorityQueue<int[]> queue=new PriorityQueue<>((a,b)->a[1]-b[1]);
queue.add(new int[]{start,0});
boolean[] flag=new boolean[m*n+2];
Arrays.fill(flag,false);
int[] dist=new int[m*n+2];
Arrays.fill(dist,Integer.MAX_VALUE/2);
dist[m*n]=0;
while(!queue.isEmpty()){
int[] arr=queue.poll();
int next=arr[0],cost=arr[1];
if(flag[next]) continue;
flag[next]=true;
for(int ne=0;ne<=m*n+1;ne++){
if(map[next][ne]+dist[next]<dist[ne]){
dist[ne]=map[next][ne]+dist[next];
queue.add(new int[]{ne,dist[ne]});
}
}
}
return dist;
}
}
最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |