微信又改版了,为了方便第一时间看到我的推送,请按照下列操作,设置“置顶”:点击上方蓝色字体“程序员乔戈里”-点击右上角“…”-点击“设为星标”。加星标不迷路!
考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰”
前言
2018.11.14号打卡明天的题目leetcode442:
题目
每天一道leetcode64-最小路径和这里说一声抱歉)
题目详述
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
题目详解
思路
对于矩阵中的任意一个位置,都可以通过这个位置的上一个位置或者左边的这一个位置移动一步 来到达这个位置(因为每次只能向下或者向右移动一步。);
对于矩阵中的任意一个位置(除去边界位置),dp(i,j) = min(dp(i-1,j),dp(i,j-1)) + grid(i,j)得到,dp(i-1,j)就是(i,j)左边的这一个点,dp(i,j-1)就是(i,j)的上一个点,比较这两个数的大小,取最小的加上grid(i,j)就是(i,j)这个位置的最小值
边界情况单独考虑,对于第一行和第一列,第一行只能是由左边的一个位置移动得来,第一列只能由它上面的位置移动得到(因为每次只能向下或者向右移动一步。);
代码
1class Solution {
2 public int minPathSum(int[][] grid) {
3 int rows = grid.length;
4 int cols = 0;
5 if(rows != 0)
6 cols = grid[0].length;
7 int [][] equation = new int[rows][cols];
8 for(int i=0;i<rows;i++)
9 {
10 for(int j=0;j<cols;j++)
11 {
12 if(i == 0 && j ==0)
13 {
14 equation[i][j] = grid[0][0];
15 }else if(i == 0)
16 {
17 equation[i][j] = equation[i][j-1] + grid[i][j];
18 }else if(j == 0)
19 {
20 equation[i][j] = equation[i-1][j] + grid[i][j];
21 }else{
22 if(equation[i][j-1] < equation[i-1][j])
23 equation[i][j] = equation[i][j-1] + grid[i][j];
24 else
25 equation[i][j] = equation[i-1][j] + grid[i][j];
26 }
27 }
28 }
29 return equation[rows-1][cols-1];
30 }
31}
代码讲解
3-7行 就是新建一个二维数组大小和grid一样,这个数组的每一个位置(i,j)用来记录到达grid(i,j)这里的路径和的最小值
8-10行 两次循环,用来遍历整个数组grid的;
12-14行 就是矩阵的左上角就是自己本身了~
15-17行 就是矩阵的第一行,就是用(i-1,j)位置的数加上grid(i,j)的值,得到(i,j)的位置的最小距离
18-20行 就是矩阵的第一列,只能由上一个位置到达(i,j)
21-25行 就是dp(i,j) = min(dp(i-1,j),dp(i,j-1)) + grid(i,j)这个状态方程的实现 上面思路已经说过
结束语
2018.11.14号打卡
作者乔戈里亲历2019秋招,哈工大计算机本硕,百度准入职java工程师,欢迎大家关注我的微信公众号:程序员乔戈里,公众号有3T编程资源,以及我和我朋友(准入职百度C++工程师)在秋招期间整理的近200M的面试必考的java与C++面经,并有每天一道leetcode打卡群与技术交流群,欢迎关注。