给你一个整数数组 nums
,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
思路一:动态规划
c语言解法
int maxProduct(int* nums, int numsSize){
if(numsSize==1){
return nums[0];
}
int ans;
float dp[numsSize][2];
dp[0][0]=fmax(0,nums[0]);
dp[0][1]=fmin(0,nums[0]);
ans=nums[0];
for(int i=1;i<numsSize;i++){
if(nums[i]==0){
dp[i][0]=dp[i][1]=0;
ans=fmax(ans,0);
}
else if(nums[i]>0){
dp[i][0]=fmax(nums[i],nums[i]*dp[i-1][0]);
dp[i][1]=nums[i]*dp[i-1][1];
ans=fmax(ans,dp[i][0]);
}
else{
dp[i][0]=nums[i]*dp[i-1][1];
dp[i][1]=fmin(nums[i],nums[i]*dp[i-1][0]);
ans=fmax(ans,dp[i][0]);
}
}
return ans;
}
分析:
本题要求乘积最大的连续子数组,可以想到若中间出现负数则原本最大值可能变为最小值,所以对每子数组的最大值和最小值均记录下来,下一个判断的时候看最大值和最小值乘上该位的数是否大于原最大值即可,最后输出答案
总结:
本题考察动态规划的应用,考虑负数的特殊情况即可解决