64. Minimum Path Sum
不定期更新leetcode解题java答案。
采用pick one的方式选择题目。
题意可变换为路经每个点都需要消耗一定的行动力,问从给定消耗二维数组,怎样从左上角行至右下角消耗行动力最小(每点消耗行动力不小于0)。所幸题意还要求了只允许向下或者向右行进,否则可以想象一个向左绕一圈的十分复杂的消耗行动力为0的路线,则很难求解。
本题则十分简单,由于行至中间点的可能只能为由上至下或者由左至右,采用贪心法,获取左侧或者上侧的点中已消耗的行动力最小值作为上一步的行进点,由此依次获取一个新的二维数组,该二维数组为由左上角行进至该点,最少消耗行动力的值。最后返回右下角的点即可,代码如下:
1 public class Solution { 2 public int minPathSum(int[][] grid) { 3 if(grid.length == 0 || grid[0].length == 0) 4 return 0; 5 int[][] count = new int[grid.length][grid[0].length]; 6 7 //count steps 8 for(int i = 0; i < grid.length; i++){ 9 for(int j = 0; j < grid[0].length; j++){ 10 if(i == 0 && j == 0) 11 count[i][j] = grid[i][j]; 12 else if(i == 0) 13 count[i][j] = grid[i][j] + count[i][j - 1]; 14 else if(j == 0) 15 count[i][j] = grid[i][j] + count[i - 1][j]; 16 else 17 count[i][j] = grid[i][j] + (count[i - 1][j] < count[i][j - 1] ? count[i - 1][j] : count[i][j - 1]); 18 } 19 } 20 21 return count[grid.length - 1][grid[0].length - 1]; 22 } 23 }