zoukankan      html  css  js  c++  java
  • LeetCode 152 乘积最大子数组

    题目

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

    思路

    动态规划问题,但是无法像最长连续子序列那样来处理。
    最长连续子序列问题中,我们维护了以第i元素为结尾的最大连续自序列和,那么我们在这个问题中,也维护一个以第i元素为结尾的最大连续自序列积maxD[i]
    因为当前位置的最优解未必是由前一个位置的最优解转移得到的,简单来说,由于序列种存在负数,那么会导致当前最大的乘积变最小的,最小的变最大的
    因此还要维护以第i元素为结尾的最小连续自序列积minD[i],当更新本状态的maxD时,也要参考minD[i - 1] * A[i]
    综上,在更新本状态时,一共有三种情况,maxD[i-1]*A[i],mind[i-1]*A[i],A[i]
    记得输出maxD[i]的最大值。

    代码

    class Solution {
    public:
        int maxProduct(vector<int>& nums) {
            vector<int> maxD(nums), minD(nums);
            int maxt = nums[0];
            for(int i = 1; i < nums.size(); i++){
                maxD[i] = max(maxD[i-1] * nums[i], max(nums[i], minD[i-1] * nums[i]));
                minD[i] = min(maxD[i-1] * nums[i], min(nums[i], minD[i-1] * nums[i]));
                maxt = max(maxD[i], maxt);
            }
            return maxt;
        }
    };
    
  • 相关阅读:
    1-5-03:均值
    1-5-01:求平均年龄
    1-04-t6993:二进制位处理
    1-4-20:求一元二次方程的根
    1-4-19:简单计算器
    1-4-18:点和正方形的关系
    1-4-17:判断闰年
    1-4-16:三角形判断
    1-4-15:最大数输出
    停止IIS服务
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/12907478.html
Copyright © 2011-2022 走看看