给你一个 n x n
整数矩阵 grid
,请你返回 非零偏移下降路径 数字和的最小值。
非零偏移下降路径 定义为:从 grid
数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。
示例 1:
输入:grid = [[1,2,3],[4,5,6],[7,8,9]] 输出:13 解释: 所有非零偏移下降路径包括: [1,5,9], [1,5,7], [1,6,7], [1,6,8], [2,4,8], [2,4,9], [2,6,7], [2,6,8], [3,4,8], [3,4,9], [3,5,7], [3,5,9] 下降路径中数字和最小的是 [1,5,7] ,所以答案是 13 。
示例 2:
输入:grid = [[7]] 输出:7
提示:
n == grid.length == grid[i].length
1 <= n <= 200
-99 <= grid[i][j] <= 99
动态规划,当前位置的答案,等于上一层的最小值(不能和当前位置同一列,所以当同一列后,应该用次小值)
用两个变量分别存储上一层的最小值和次小值,然后对当前层进行处理并存储。
class Solution { public int minFallingPathSum(int[][] grid) { int n = grid.length; int min1 = Integer.MAX_VALUE; int min2 = Integer.MAX_VALUE; for (int i = 0; i < n; i++) { if (grid[0][i] < min2) { if (grid[0][i] < min1) { min2 = min1; min1 = grid[0][i]; } else { min2 = grid[0][i]; } } } for (int i = 1; i < n; i ++) { int tem1 = Integer.MAX_VALUE; int tem2 = Integer.MAX_VALUE; for (int j = 0; j < n; j ++) { if (grid[i - 1][j] != min1) { grid[i][j] += min1; } else { grid[i][j] += min2; } if (grid[i][j] < tem2) { if (grid[i][j] < tem1) { tem2 = tem1; tem1 = grid[i][j]; } else { tem2 = grid[i][j]; } } } min1 = tem1; min2 = tem2; } return Math.min(min1, min2); } }
标签:力扣,tem2,tem1,int,1289,---,grid,min1,min2 From: https://www.cnblogs.com/allWu/p/17620957.html