leetcode做题笔记152. 乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

子数组 是数组的连续子序列。

思路一:动态规划

c语言解法

cpp 复制代码
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;
}

分析:

本题要求乘积最大的连续子数组,可以想到若中间出现负数则原本最大值可能变为最小值,所以对每子数组的最大值和最小值均记录下来,下一个判断的时候看最大值和最小值乘上该位的数是否大于原最大值即可,最后输出答案

总结:

本题考察动态规划的应用,考虑负数的特殊情况即可解决

相关推荐
wayz114 分钟前
Overlap:HWMA(Holt-Winter移动平均线)技术指标详解
算法·金融·数据分析·量化交易·特征工程
ctrl_v助手5 分钟前
VisionPro (R) QuickBuild相机的连接
服务器·笔记·数码相机·c#
代码搬运媛19 分钟前
Express 入门到精通笔记
笔记·express
Shadow(⊙o⊙)21 分钟前
专题四:前缀和
数据结构·算法
JAVA面经实录91728 分钟前
高频算法面试题
java·计算机网络·算法·面试
qq_4523962329 分钟前
第十一篇:《资源管理:Requests/Limits、ResourceQuota、LimitRange》
算法·贪心算法
Tisfy33 分钟前
LeetCode 2095.删除链表的中间节点:两次遍历 / 一次遍历(快慢指针)
算法·leetcode·链表·题解·双指针
格兰芬多呼神护卫38 分钟前
中国电信 TeleAI 开源 KungfuBot / PBHC 框架分析笔记
笔记·开源
Irissgwe40 分钟前
AVL树详解
数据结构·c++·算法·二叉树·c·二叉搜索树·avl