题目
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例及提示
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码(C语言)
#include<stdio.h>
#include<malloc.h>
int max(int a,int b,int c){
int max=0;
if(a>=b){
max=a;
}
else{
max=b;
}
if(max<=c){
max=c;
}
return max;
}
int min(int a,int b,int c){
int min=0;
if(a>=b){
min=b;
}
else{
min=a;
}
if(min>=c){
min=c;
}
return min;
}
int maxProduct(int* nums, int numsSize){
//申请动态存储空间
int value=nums[0];
int *maxf = (int *)malloc(sizeof(int) * (numsSize+1));
int *minf = (int *)malloc(sizeof(int) * (numsSize+1));
maxf[0]=1;
minf[0]=1;
for(int i=1;i<=numsSize;i++) {
maxf[i]= max(maxf[i-1]*nums[i-1],minf[i-1]*nums[i-1],nums[i-1]);
minf[i]= min(minf[i-1]*nums[i-1],maxf[i-1]*nums[i-1],nums[i-1]);
//printf("%d %d %d %d",maxf[i-1]*nums[i-1],minf[i-1]*nums[i-1],nums[i-1],maxf[i]);
//printf("\n");
if(maxf[i]>value){
value=maxf[i];
}
}
return value;
}
int main(){
int nums[]={-2};
int m=sizeof(nums)/sizeof(nums[0]);
int value=maxProduct(nums, m);
printf("%d ",value);
}
根据官网的结题思路写的,最近沉迷毕设,无心写注释(我原本是对写代码不注释嗤之以鼻的…)。
解读
动态规划,重点在构建转移式