剑指 Offer 42. 连续子数组的最大和

难度 简单

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例1:

1
2
3
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

提示:

  • 1 <= arr.length <= 10^5
  • -100 <= arr[i] <= 100

注意:本题与主站 53 题相同:https://leetcode-cn.com/problems/maximum-subarray/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
假设数组为[-2,1,-3,4,-1,2,1,-5,4],分解每一步问题:
[-2,1,-3,4,-1,2,1,-5,4] -> 6
[-2,1,-3,4,-1,2,1,-5] -> 6
[-2,1,-3,4,-1,2,1] -> 6
[-2,1,-3,4,-1,2] -> 5
[-2,1,-3,4,-1] -> 4
[-2,1,-3,4] -> 4
[-2,1,-3] -> 1
[-2,1] -> 1
[-2] -> -2
转移方程:F[i] = nums[i] + F[i-1]; //F[i-1] > 0
F[i] = nums[i]; //F[i-1] <= 0
*/
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if( nums.empty() ) return 0;
int max,n = nums.size();

max = nums[0];

for(int i = 1; i < n;i++)
{
if( nums[i-1] > 0 ) nums[i] += nums[i-1];
if( nums[i] > max ) max = nums[i];
}

return max;
}
};

剑指 Offer 47. 礼物的最大价值

难度 中等

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

示例 1:

1
2
3
4
5
6
7
8
输入: 
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物

提示:

  • 0 < grid.length <= 200
  • 0 < grid[0].length <= 200

思路

转移方程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
转移方程:F[i][j] = max(F[i-1][j], F[i][j-1]) + grid[i][j];
*/

class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
if(grid.empty())return 0;

int m,n,sum;

sum = grid[0][0];
m = grid.size();
n = grid[0].size();

int i,j;
for( j = 1; j < n ;j++ )
grid[0][j] += grid[0][j-1] ;
for( i = 1; i < m ;i++ )
grid[i][0] += grid[i-1][0] ;
for( i = 1; i < m ; i++ )
{
for( j = 1; j < n; j++ )
{
grid[i][j] += max(grid[i][j-1], grid[i-1][j]);
}
}
return grid[m-1][n-1];
}
};