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;
}

分析:

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

总结:

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

相关推荐
NAGNIP19 小时前
一文搞懂树模型与集成模型
算法·面试
NAGNIP19 小时前
万字长文!一文搞懂监督学习中的分类模型!
算法·面试
技术狂人16819 小时前
工业大模型工程化部署实战!4 卡 L40S 高可用集群(动态资源调度 + 监控告警 + 国产化适配)
人工智能·算法·面试·职场和发展·vllm
D_FW20 小时前
数据结构第六章:图
数据结构·算法
wdfk_prog20 小时前
[Linux]学习笔记系列 -- hashtable
linux·笔记·学习
a程序小傲20 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
自学不成才20 小时前
深度复盘:一次flutter应用基于内存取证的黑盒加密破解实录并完善算法推理助手
c++·python·算法·数据挖掘
June`21 小时前
全排列与子集算法精解
算法·leetcode·深度优先
徐先生 @_@|||21 小时前
Palantir Foundry 五层架构模型详解
开发语言·python·深度学习·算法·机器学习·架构