题目大意:假设一个数组为[5,7,6,4,2,9,5,4],AOE的范围是4,我们应该关注边缘5是怎么没有的,需要AOE在5的边缘打5次这样一定最省,打完5次数组的血量如下[0,2,1,-1,2,9,5,4],小于0就代表血量已经为空了,然后依次向后血量不为0的进行遍历,直到所有的血量都为0为止。
如图所示,此时AOE需要释放5+2+9=16次技能,
解法一:暴力解,假设AOE在每一个位置都放,类似一个全排列的方式进行验证。
代码如下:
解法二:为了避免每次减掉的数字都遍历使用使用线段shu来进行求解,时间复杂度O(N*logN).
代码如下:
题目二
给定一个 m x n 整数矩阵 matrix ,找出其中最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线 方向上移动或移动到边界外(即不允许环绕)。
示例:给定一个mxn整数矩阵matrix ,找出其中最长递增路径的长度。
输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4
解释:最长递增路径为 [1, 2, 6, 9]。
解法一:暴力递归,一个位置一个位置的去试,时间复杂度高,会超出时间限制。
代码如下:
public int longestIncreasingPath(int[][] matrix) {
int ans = 0 ;
int N = matrix.length;
int M = matrix[0].length;
//你可以在每一个位置上都试上一遍
for (int i = 0 ; i < N ; i++){
for (int j = 0 ; j < N ; j++){
ans = Math.max(ans,process(matrix,i,j));
}
}
return ans;
}
//从m[i][j]开始出发
public int process(int[][] matrix ,int i ,int j){
//边界判断
if (i < 0 || i == matrix.length || j < 0 || j == matrix[0].length){
return 0;
}
//上下左右暴力尝试
int up = i > 0 && matrix[i][j] < matrix[i - 1][j] ? process(matrix ,i - 1,j) : 0 ;
int down = i+1 != matrix.length && matrix[i][j] < matrix[i + 1][j] ? process(matrix,i + 1,j) : 0;
int left = j > 0 && matrix[i][j] < matrix[i][j-1] ? process(matrix,i,j - 1) : 0;
int right = j + 1 != matrix[0].length && matrix[i][j] < matrix[i][j + 1] ? process(matrix,i,j + 1) : 0;
return Math.max(Math.max(left,right),Math.max(up,down)) + 1;
}
}
解法二:记忆化搜索,因为答案只和 i,j 的位置有关,如果 i 和 j 确定了那么答案也就确定了,准备一个dp表记录答案,直接通过力扣。
代码如下:
public int longestIncreasingPath(int[][] matrix) {
int ans = 0 ;
int N = matrix.length;
int M = matrix[0].length;
//你可以在每一个位置上都试上一遍
int[][] dp = new int[N][M];
for (int i = 0 ; i < N ; i++){
for (int j = 0 ; j < M ; j++){
ans = Math.max(ans,process2(matrix,i,j,dp));
}
}
return ans;
}
public int process2(int[][]matrix ,int i , int j , int[][] dp){
//看缓存表里是否存在
if (dp[i][j] != 0){
return dp[i][j];
}
//边界判断
if (i < 0 || i == matrix.length || j < 0 || j == matrix[0].length){
return 0;
}
int up = i > 0 && matrix[i][j] < matrix[i - 1][j] ? process2(matrix ,i - 1,j,dp) : 0 ;
int down = i+1 != matrix.length && matrix[i][j] < matrix[i + 1][j] ? process2(matrix,i + 1,j,dp) : 0;
int left = j > 0 && matrix[i][j] < matrix[i][j-1] ? process2(matrix,i,j - 1,dp) : 0;
int right = j + 1 != matrix[0].length && matrix[i][j] < matrix[i][j + 1] ? process2(matrix,i,j + 1,dp) : 0;
int ans = Math.max(Math.max(left,right),Math.