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

分析:

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

总结:

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

相关推荐
byzh_rc6 小时前
[模式识别-从入门到入土] 支持向量积SVM
数据库·人工智能·算法
Asus.Blogs6 小时前
学习笔记:CrewAI vs. Dify
笔记·学习
im_AMBER6 小时前
Leetcode 86 【二分查找】在排序数组中查找元素的第一个和最后一个位置
笔记·学习·算法·leetcode
有一个好名字6 小时前
力扣:种花问题
算法·leetcode·职场和发展
会编程是什么感觉...6 小时前
算法 - Impedance Track 阻抗跟踪笔记
算法·bms·电量计
sprintzer6 小时前
力扣12.16-12.25数组刷题
算法·leetcode·职场和发展
点云侠6 小时前
基于选权迭代法的空间平面拟合
线性代数·算法·平面
AndrewHZ6 小时前
【图像处理基石】VR的眩晕感是如何产生的?
图像处理·算法·计算机视觉·vr·cv·立体视觉·眩晕感
diegoXie6 小时前
【R】新手向:renv 攻克笔记
开发语言·笔记·r语言
智算菩萨6 小时前
【Python基础】排序算法的深度解析与实践应用:从理论到性能优化的全面指南
算法·性能优化·排序算法