1. 最大子数组求和
int maxSubArray(int* nums, int numsSize){
int max,premax,i;
max = premax = nums[i];
for(i=1;i<numsSize;i++){
premax = premax+nums[i]>nums[i]?premax+nums[i]:nums[i];
max = max>premax?max:premax;
}
return max;
}
2. 最大子数组求积![在这里插入图片描述](https://img-blog.csdnimg.cn/51112c21a0a841a7ac4248aebd457198.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5piv6JC96JC95ZGi,size_20,color_FFFFFF,t_70,g_se,x_16)
二维的辅助数组
int maxProduct(int* nums, int numsSize){
int dp[numsSize][numsSize];
int i,len,max;
//len==1
for(i=0;i<numsSize;i++)
dp[i][i] = nums[i];
//len>=2
for(len=2;len<=numsSize;len++){
for(i=0;i<numsSize-len+1;i++){
dp[i][i+len-1] = dp[i][i+len-2] * nums[i+len-1];
}
}
//寻找最大值
max = dp[0][0];
for(len = 1;len<=numsSize;len++){
for(i=0;i<numsSize-len+1;i++){
if(max<dp[i][i+len-1])
max = dp[i][i+len-1];
}
}
return max;
}
但是遇到这种很长的数组,辅助数组的空间需要很大
与求和思路相似方法
int Max(int a,int b){
return a>b?a:b;
}
int Min(int a,int b){
return a>b?b:a;
}
int maxProduct(int* nums, int numsSize){
int i,max,min,ans;
max = min = ans = nums[0];
for(i=1;i<numsSize;i++){
int fmax,fmin;
fmax = max, fmin = min;
max = Max(fmax*nums[i],Max(fmin*nums[i],nums[i]));
min = Min(fmax*nums[i],Min(fmin*nums[i],nums[i]));
ans = Max(ans,max);
}
return ans;
}