题目地址:
https://leetcode.com/problems/maximum-subarray/
给定一个长 n n n的整型数组,求和最大的非空子数组的和。
设 f ( a 0 , a 1 , . . . , a n ) f(a_0,a_1,...,a_n) f(a0,a1,...,an)为向量 ( a 0 , a 1 , . . . , a n ) (a_0,a_1,...,a_n) (a0,a1,...,an)的最大子数组和,而 g ( a 0 , a 1 , . . . , a n ) g(a_0,a_1,...,a_n) g(a0,a1,...,an)为向量 ( a 0 , a 1 , . . . , a n ) (a_0,a_1,...,a_n) (a0,a1,...,an)的以 a n a_n an为结尾的最大子数组和。算法可以由下面的递推方程得到: f ( a 0 , a 1 , . . . , a n ) = max k ∈ { 0 , 1 , . . . , n } g ( a 0 , a 1 , . . . , a k ) g ( a 0 , a 1 , . . . , a k ) = { a 0 , k = 0 max ( 0 , g ( a 0 , a 1 , . . . , a k − 1 ) ) + a k , k > 0 f(a_0,a_1,...,a_n)=\max_{k\in \{0,1,...,n\}}g(a_0,a_1,...,a_k)\\ g(a_0,a_1,...,a_k)=\begin{cases}a_0,\ k = 0\\\max(0,g(a_0,a_1,...,a_{k-1}))+a_k,\ k>0\end{cases} f(a0,a1,...,an)=k∈{0,1,...,n}maxg(a0,a1,...,ak)g(a0,a1,...,ak)={a0, k=0max(0,g(a0,a1,...,ak−1))+ak, k>0代码如下:
class Solution {
public:
int maxSubArray(vector<int>& a) {
int res = -2e9, cur_sum = 0;
for (int x : a) {
cur_sum = max(x, cur_sum + x);
res = max(res, cur_sum);
}
return res;
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。