一、剑指 Offer 42. 连续子数组的最大和
class Solution {
public int maxSubArray(int[] nums) {
if(nums.length==1){
return nums[0];
}
int max=Integer.MIN_VALUE;
int sum=0;
for(int i=0;i<nums.length;i++){
sum+=nums[i];
max=Math.max(max,sum);
sum=sum<=0?0:sum;
}
return max;
}
}
二、剑指 Offer 47. 礼物的最大价值
总结:刚开始以为是贪心算法,从起点开始,哪里大往哪里拐,但是我忽略了此题不符合局部最优就是全局最优的条件。采用动态规划思想,递推关系就是当前坐标上边和右边数的最大值和当前坐标的和。
class Solution {
public int maxValue(int[][] grid) {
int row = grid.length;
int col = grid[0].length;
int[][] dp = new int[row][col];
dp[0][0] = grid[0][0];
int temp = grid[0][0];
for (int i = 1; i < row; i++) {
temp += grid[i][0];
dp[i][0] = temp;
}
temp = grid[0][0];
for (int i = 1; i < col; i++) {
temp += grid[0][i];
dp[0][i] = temp;
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
dp[i][j] = grid[i][j] + Math.max(dp[i][j - 1], dp[i - 1][j]);
}
}
return dp[row - 1][col - 1];
}
}