- 最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:
输入:grid = [[1,2,3],[4,5,6]]
输出:12
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
最开始的回溯,和暴力没什么区别,超时了。改用dp
class Solution {
int ans=Integer.MAX_VALUE;
public int minPathSum(int[][] grid) {
int i=0;//行
int j=0;//列
int total=0;
dfs(grid,i,j,total);
return ans;
}
public void dfs(int[][] grid,int row,int col,int total){
//退出条件
if(row == grid.length-1 && col==grid[0].length-1){
total+=grid[row][col];//加上最后一个格的数值
if(total<ans){
ans=total;
}
return;
}
if(total > ans){
//当前总数已经大于之前得到的答案, 则该路径不行,直接退出
return;
}
//向左,列数+1
if(col+1<=grid[0].length-1){
dfs(grid, row, col+1, total+grid[row][col]);
}
//向右,行数+1
if(row+1<=grid.length-1){
dfs(grid, row+1, col, total+grid[row][col]);
}
}
}
dp!!!!过啦
class Solution {
public int minPathSum(int[][] grid) {
int total=0;
int dp[][]=new int[grid.length][grid[0].length];//dp[i][j]表示到达下标为i,j位置时需要的最短路径
//第一行和第一列只能由一直向右或者一直向下得到,对他们进行初始化
dp[0][0]=grid[0][0];
for(int j=1;j<grid[0].length;j++){
dp[0][j]=dp[0][j-1]+grid[0][j];
}
for (int i=1;i<grid.length;i++){
dp[i][0]=dp[i-1][0]+grid[i][0];
}
for(int i=1;i<grid.length;i++ ){
for(int j=1;j<grid[0].length;j++){
dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1])+grid[i][j];
}
}
return dp[grid.length-1][grid[0].length-1];
}
}
总结
写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取。
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!
全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。