提前准备的知识(虽然后面没用到):
1.动态规划正常是要开数组的,所以相关数据类型的抉择是个问题:
short 2bytes; 大约3万 5位数字
int 4bytes; 大约20亿 10位数字
long 4bytes; 大约20亿 10位数字
long long 8bytes; *** 19位数字
按照前辈经验:在开数组时常常用int或者long long,自行根据题目数据选择(指标数字位数最有用)。
。。。。。。。。。。。。。。。。。。。。。。。。。
动态规划的思考:
2.动态规划的步骤:
①开数组
②将状态转移方程翻译成代码
a:初始化
b:根据状态转移方程编写:条件语句,循环语句
c:返回要求的值
3.从动态规划的角度思考:
(事实上,不参照其他代码自己根本想不出动态规划是要怎么做,现在努力的从动态规划的角度思考。)
a. 最后生成的最大的子数组的值是由上一个子数组的基础上建立的。 初始化从第一个数开始。
b.思考状态转移方程:如果之前的总值小于零,那么那一段就可以舍弃了;如果之前的总和大于零则允许和这次相加。
c.在过程中记录最大值,在最大值更新的条件下,记录数组范围。
4.代码:
int maxSubArray(vector<int>& nums) {
int max_sum=nums[0],sum=nums[0]; //初始化 max_sum WA过
for(int i=1;i<nums.size();i++)
{
if(sum>0)
{
sum+=nums[i];
//start=i; //只要总和大于零就记录开头
}
else //前面总和是负值就全部舍弃
{
sum=nums[i];
}
if(sum>max_sum) //在最大值更新的时候记录结尾
{
max_sum=sum;
//end=i;
}
}
return max_sum;
}
时间复杂度分析:事实上就只是一个循环:n
WA:总数组只有一个的情况要考虑到