当前位置: 首页 > article >正文

动态规划-子数组系列——乘积最大子数组

1.题目解析

题目来源:152.乘积最大子数组——力扣

测试用例

2.算法原理

1.状态表示

由于题目给的数组中可以包含负数,因此求最大乘积有两种情况:

a.负数乘以最小数得出最大乘积 b.整数乘以最大数得出最大乘积

所以需要两个表分别求出最大最小数,即创建f表存储最大数,g表存储最小数

f[i]:从开始位置到第i个位置的最大子数组乘积

g[i]:从开始位置到第i个位置的最小子数组乘积

2.状态转移方程

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

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

3.初始化

根据状态转移方程可知每个位置都需要用到前一个位置来进行计算,因此需要初始化两个表的第一个位置,这里更加简单的是使用一个虚拟位置,因为是乘积计算所以将虚拟位置赋值为1不会影响后续填表

4.填表顺序

从前向后,两个表一起填写

5.返回值

返回f表中的最大值即可

3.实战代码

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n + 1);
        vector<int> g(n + 1);

        f[0] = g[0] = 1;
        int ret = INT_MIN;

        for (int i = 1; i <= n; i++) {
            int x = nums[i - 1];
            int y = f[i - 1] * nums[i - 1];
            int z = g[i - 1] * nums[i - 1];
            f[i] = max(x, max(y, z));
            g[i] = min(x, min(y, z));

            ret = max(ret, f[i]);
        }

        return ret;
    }
};

 


http://www.kler.cn/news/358104.html

相关文章:

  • 【面试11】嵌入式之模电/数电
  • setState更新状态的2种写法
  • 高级算法设计与分析 学习笔记14 FFT
  • Axure科技感元件:打造可视化大屏设计的得力助手
  • CMake技术细节:解决未定义,提供参数
  • 基于MATLAB的交通标志的识别
  • ARM嵌入式学习--第四天
  • Flutter Column和Row组件
  • java-实例化一个List并添加数据的方法
  • yolov8实例分隔
  • 胤娲科技:AI大模型的隐秘战争——当“智能”成为双刃剑
  • 会议点名人员crud-web前端Vue3多选调用示例
  • docker 数据管理,数据持久化详解 二 数据卷容器
  • git命令使用一览【自用】
  • 《Effective C++》 笔记
  • VLAN虚拟技术
  • 《知道做到》
  • uniapp_微信小程序_echarts_动态折线图
  • webAPI中的排他思想、自定义属性操作、节点操作(配大量案例练习)
  • html css js 生成随机颜色