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

分析:

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

总结:

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

相关推荐
侯小啾3 小时前
【03】C语言 强制类型转换 与 进制转换
c语言·数据结构·算法
Xの哲學4 小时前
Linux NAPI 架构详解
linux·网络·算法·架构·边缘计算
koo3646 小时前
李宏毅机器学习笔记30
人工智能·笔记·机器学习
摇滚侠7 小时前
Spring Boot 3零基础教程,WEB 开发 内嵌服务器底层源码分析 笔记48
spring boot·笔记
京东零售技术7 小时前
扛起技术大梁的零售校招生们 | 1024技术人特别篇
算法
爱coding的橙子8 小时前
每日算法刷题Day78:10.23:leetcode 一般树7道题,用时1h30min
算法·leetcode·深度优先
Swift社区8 小时前
LeetCode 403 - 青蛙过河
算法·leetcode·职场和发展
地平线开发者8 小时前
三种 Badcase 精度验证方案详解与 hbm_infer 部署实录
算法·自动驾驶
报错小能手8 小时前
项目——基于C/S架构的预约系统平台 (1)
开发语言·c++·笔记·学习·架构
papership8 小时前
【入门级-算法-5、数值处理算法:高精度的减法】
算法·1024程序员节