给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
思考:最近在集中练习动态规划的题,这应该算是比较经典的动态规划题,但还是够我想的……因为之前看到的动态规划题目都是使用的二维数组,所以我用这个思路就一直没有想出答案,看了解答才知道用一维数组就行了
官方解答:
方法1:动态规划
动态转移方程:
f
(
i
)
=
m
a
x
(
f
(
i
−
1
)
+
a
i
,
a
i
)
f(i) = max(f(i-1)+a_{i}, a_{i})
f(i)=max(f(i−1)+ai,ai)
即考虑第i个元素是否要加入当前的最小大子序就要看
a
i
a_{i}
ai和前i-1个元素的最大子序和
f
(
i
−
1
)
f(i-1)
f(i−1)与第i个元素
a
i
a_{i}
ai之和谁更大。
时间复杂度
O
(
n
)
O(n)
O(n)、空间复杂度
O
(
n
)
O(n)
O(n)。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre = 0, maxAns = nums[0];
for (const auto &x: nums) {
pre = max(pre + x, x);
maxAns = max(maxAns, pre);
}
return maxAns;
}
};
方法2:分治法(以后专门做分治法的时候在拿回来写)