【算法|动态规划No.12】leetcode152. 乘积最大子数组

个人主页:兜里有颗棉花糖

欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创

收录于专栏【手撕算法系列专栏】【LeetCode

🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助

🍓希望我们一起努力、成长,共同进步。

目录

1️⃣题目描述

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

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

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

示例1:

输入: nums = [2,3,-2,4]

输出: 6

解释: 子数组 [2,3] 有最大乘积 6。

示例2:

输入: nums = [-2,0,-1]

输出: 0

解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

注意:

  • 1 <= nums.length <= 2 * 104
  • -10 <= nums[i] <= 10
  • nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数

2️⃣题目解析

虽然本题目要求的是求取乘积最大子数组,但是我们还得把乘积最小的情况求取出来。为什么呢?因为不只是正数 * 正数 > 0,还有负数 * 负数 = 正数的情况。

状态表示:

  • f[i]表示以i位置为结尾的所有子数组的最大乘积
  • g[i]表示以i位置为结尾的所有子数组的最小乘积

状态转移方程:

  • f[i] = max(max(nums[i],f[i - 1] * nums[i - 1]),g[i - 1] * nums[i - 1]);
  • g[i] = min(min(nums[i],f[i - 1] * nums[i - 1]),g[i - 1] * nums[i - 1]);

3️⃣解题代码

cpp 复制代码
class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n+1);
        auto g = f;
        f[0] = g[0] = 1;
        int ret = INT_MIN;
        for(int i = 1;i <= n;i++)
        {
            int a = nums[i - 1];
            int b = f[i - 1] * nums[i - 1];
            int c = g[i - 1] * nums[i - 1];

            f[i] = max(max(a,b),c);
            g[i] = min(min(a,b),c);
            ret = max(ret,f[i]);
        }
        return ret;
    }
};

通过啦!!!

相关推荐
little redcap17 分钟前
第十九次CCF计算机软件能力认证-乔乔和牛牛逛超市
数据结构·c++·算法
muyierfly1 小时前
34.贪心算法1
算法·贪心算法
luthane3 小时前
python 实现average mean平均数算法
开发语言·python·算法
静心问道3 小时前
WGAN算法
深度学习·算法·机器学习
杰九4 小时前
【算法题】46. 全排列-力扣(LeetCode)
算法·leetcode·深度优先·剪枝
manba_4 小时前
leetcode-560. 和为 K 的子数组
数据结构·算法·leetcode
liuyang-neu4 小时前
力扣 11.盛最多水的容器
算法·leetcode·职场和发展
忍界英雄4 小时前
LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
算法·leetcode·机器人
Kenneth風车4 小时前
【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·数据分析
C7211BA4 小时前
使用knn算法对iris数据集进行分类
算法·分类·数据挖掘