编程题:最小矩阵路径
矩阵的最小路径和:
给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。
考察点:数组、动态规划
思路:
到达一个点(i,j)我们可以选择从(i-1,j)下来,或者从(i,j-1)往右过来,那么到达(i,j)的最小路径和则是两者中小的那个。
解题:
构建最小路径和矩阵minL,返回矩阵右下角的值。
当i=0&&j=0:minL[i][j] = matrix[i][j]
当i=0: minL[i][j] = minL[i][j-1]+matrix[i][j]
当j=0: minL[i][j] = minL[i-1][j]+matrix[i][j]
当j>0&&j>0: minL[i][j] = minL[i-1][j]+matrix[i][j]和minL[i][j-1]+matrix[i][j]中的最小值
/** *左上角到右下角的最小矩阵和,只能向右向下 * @param matrix int整型二维数组 the matrix * @return int整型 */ public int minPathSum (int[][] matrix) { // 到达每个点的最小路径和=min(左边点的最小路径和,右边的最小路径和)+自己本身的权 //递归超时……使用数组存储以及循环 if(matrix.length==0) return 0; if(matrix[0].length==0) return 0; //return minPathSumofPoint(matrix,matrix.length-1,matrix[0].length-1); int[][] minl = new int[matrix.length][matrix[0].length]; for(int i=0;i<matrix.length;i++){ for(int j=0;j<matrix[i].length;j++){ if(i==0&&j==0){ minl[i][j] = matrix[i][j]; } else if(i==0){ minl[i][j] = minl[i][j-1]+matrix[i][j]; } else if(j==0){ minl[i][j] = minl[i-1][j]+matrix[i][j]; } else{ if(minl[i-1][j]<minl[i][j-1]){ minl[i][j] = minl[i-1][j]+matrix[i][j]; } else{ minl[i][j] = minl[i][j-1]+matrix[i][j]; } } } } return minl[matrix.length-1][matrix[0].length-1]; } public int minPathSumofPoint(int[][] matrix,int i,int j){ if(i<0||j<0){ return -1; } if(i==0&&j==0){ return matrix[0][0]; } else if(i==0){ //System.out.println(matrix[i][j]); return minPathSumofPoint(matrix,i,j-1)+matrix[i][j]; } else if(j==0){ //System.out.println(matrix[i][j]); return minPathSumofPoint(matrix,i-1,j)+matrix[i][j]; } else{ //System.out.println(matrix[i][j]); return Math.min(minPathSumofPoint(matrix,i,j-1)+matrix[i][j],minPathSumofPoint(matrix,i-1,j)+matrix[i][j]); } }
当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。