第一题
解题思路:
我们可以通过修改nums[i]的元素内容,来记录前n个数组元素构成的最大子数组
每次寻找最大子数组,都需要比较当前最大子数组是否小于零,理由是如果小于零,加上当前元素一定更小===>即现在的nums[i]是最新的最大子数组
因此可以得到状态转移方程:
if(nums[i-1]<0) nums[i]=nums[i];
else nums[i]=nums[i-1]+nums[i];
此外,我们还需要比较所有寻找到的最大子数组,找到最大的那个
res=Math.max(res,nums[i]);
代码实现:
class Solution {
public int maxSubArray(int[] nums) {
int res=nums[0];
for(int i=1;i<nums.length;i++){
nums[i]+=Math.max(nums[i-1],0);
res=Math.max(res,nums[i]);
}
return res;
}
}
第二题
解题思路:
代码实现:
class Solution {
public int maxValue(int[][] grid) {
int n=grid.length,m=grid[0].length;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==0&&j==0) continue;
else if(i==0) grid[i][j]+=grid[i][j-1];
else if(j==0) grid[i][j]+=grid[i-1][j];
else grid[i][j]+=Math.max(grid[i][j-1],grid[i-1][j]);
}
}
return grid[n-1][m-1];
}
}
优化方案:
class Solution {
public int maxValue(int[][] grid) {
int m = grid.length, n = grid[0].length;
for(int j = 1; j < n; j++) // 初始化第一行
grid[0][j] += grid[0][j - 1];
for(int i = 1; i < m; i++) // 初始化第一列
grid[i][0] += grid[i - 1][0];
for(int i = 1; i < m; i++)
for(int j = 1; j < n; j++)
grid[i][j] += Math.max(grid[i][j - 1], grid[i - 1][j]);
return grid[m - 1][n - 1];
}
}