题目描述:给你一个整数数组 nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
1. 暴力
两层循环,计算任意起点到任意重点的值,求最大值,喜提超时。
int maxSubArray(vector<int>& nums) {
int ans=INT32_MIN,tep=0;//INT21_MIN十进制表示为−2147483648
int n=nums.size();
for(int i=0;i<n;i++){
tep=0;
for(int j=i;j<n;j++){
tep+=nums[j];
if(tep>ans) ans=tep;
}
}
return ans;
}
2. 动态规划
能否用动态规划在于两个点:(1)问题答案依赖于问题规模。(2)问题答案可由小规模问题的递推。步骤:(1)建立状态转移方程。(2)存储之前的结果。(3)从小到大开始计算。
对于本题,把
f
(
i
)
f(i)
f(i)看做以第i个数为终点的最大子数组和,则状态转移方程:
f
(
i
)
=
m
a
x
(
f
(
i
−
1
)
+
n
u
m
s
[
i
]
,
n
u
m
s
[
i
]
)
f(i)=max(f(i-1)+nums[i],nums[i])
f(i)=max(f(i−1)+nums[i],nums[i])
int maxSubArray(vector<int>& nums) {
int pre=0,maxa=nums[0];
for(auto i:nums){
pre=max(pre+i,i);
maxa=max(pre,maxa);
}
return maxa;
}
3. 分治
还没弄懂。。