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

分析:

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

总结:

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

相关推荐
(❁´◡`❁)Jimmy(❁´◡`❁)3 分钟前
P1156 [USACO01OPEN] 垃圾陷阱
算法·动态规划
疯狂打码的少年18 分钟前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法
蒸蒸yyyyzwd22 分钟前
后端面经学习笔记
笔记·学习
lally.31 分钟前
整数等差数列超图中的三个非微扰现象
算法
wabs66640 分钟前
关于字符串【力扣541.反转字符串II的思考】
数据结构·算法·leetcode·字符串
土司大王44 分钟前
LeetCode hot100——移动零
java·算法·leetcode
简简单单lym1 小时前
mediasou c++分析--流分析
笔记·webrtc
糖炒栗子03261 小时前
learn-claude-code 简要记录
笔记·python
Tyler_TXZ2 小时前
C++C语言之——树
c语言·c++·算法·
旖旎夜光2 小时前
LeetCode 30:串联所有单词的子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口