64. Minimum Path Sum (Medium)
题目描述
给定一个包含非负整数的 _m_ x _n_ 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
思路
dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + grid[i][j]
class Solution {public int minPathSum(int[][] grid) {int x = grid.length;int y = grid[0].length;int[][] dp = new int[x][y];//初始化dp[0][0] = grid[0][0];for(int i=1; i<y; i++){dp[0][i] = dp[0][i-1] + grid[0][i];}for(int i=1; i<x; i++){for(int j=0; j<y; j++){if(j==0){dp[i][j] = dp[i-1][j] + grid[i][j];}else{dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + grid[i][j];}}}return dp[x-1][y-1];}}
内存优化
思路
只需要记录上一行的dp即可。
class Solution {public int minPathSum(int[][] grid) {int x = grid.length;int y = grid[0].length;int[] dp = new int[y];//初始化dp[0] = grid[0][0];for(int i=1; i<y; i++){dp[i] = dp[i-1] + grid[0][i];}for(int i=1; i<x; i++){for(int j=0; j<y; j++){if(j==0){dp[j] = dp[j]+grid[i][j];}else{dp[j] = Math.min(dp[j-1],dp[j]) + grid[i][j];}}}return dp[y-1];}}
62. Unique Paths (Medium)
题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例
输入:m = 3, n = 7
输出:28
class Solution {public int uniquePaths(int m, int n) {int[][] dp =new int[m][n];//初始化for(int i=0; i<n; i++){dp[0][i] = 1;}for(int i=0; i<m; i++){dp[i][0] = 1;}for(int i=1; i<m; i++){for(int j=1; j<n; j++){dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[m-1][n-1];}}
内存优化
同上
class Solution {public int uniquePaths(int m, int n) {int[] dp = new int[n];//初始化for(int i=0; i<n; i++){dp[i] = 1;}for(int i=1; i<m; i++){for(int j=1; j<n; j++){dp[j] = dp[j-1] + dp[j];}}return dp[n-1];}}

