zoukankan      html  css  js  c++  java
  • Leetcode 152.乘机最大子序列

    乘积最大子序列

    给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

    示例 1:

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

    输出: 6

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

    示例 2:

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

    输出: 0

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

    解题思路:乘法与加法最大差别在于,当前元素的符号具有全局性的作用。

    如果当前元素为负,那么连乘到上个元素的最大乘积,再乘以当前元素,就变成负数,甚至可能成为最小乘积。

    同样,连乘到上个元素的最小乘积如为负,再乘以当前元素,就变成正数,甚至可能成为最大乘积。

       

    因此使用动态规划的方法:

    记maxLast/minLast为连乘到上个元素的最大/小乘积

    记maxCur/minCur为连乘到当前元素的最大/小乘积

    记maxAll为全局最大乘积

     1 class Solution{
     2 public:
     3     int maxProduct(vector<int>& nums){
     4         if (nums.empty()){
     5             return 0;
     6         }
     7         if (nums.size() == 1){
     8             return nums[0];
     9         }
    10         int maxAll = nums[0];//global maximum
    11         int maxLast = nums[0];//maximum including last element
    12         int maxCur;//maximum including current element
    13         int minLast = nums[0];//minumum including current element
    14         int minCur;//minimum including last element
    15         for (int i = 1; i<nums.size(); i++){
    16             maxCur = max(nums[i], max(maxLast*nums[i], minLast*nums[i]));
    17             minCur = min(nums[i], min(maxLast*nums[i], minLast*nums[i]));
    18             maxLast = maxCur;
    19             minLast = minCur;
    20             maxAll = max(maxAll, maxCur);
    21         }
    22         return maxAll;
    23     }
    24 };
  • 相关阅读:
    Ehcache缓存配置和基本使用
    微信公众号接入图灵机器人实现自动回复消息
    数据库索引的使用
    oracle中=>是什么意思
    [转载]AppSettings和ConnectionStrings的区别
    获得字符串长度
    HTML------8.调用接口 实现动态折现图
    HTML------7.编辑折现图
    JAVA------14.今日和昨日时间转换
    JAVA------13.字符串去掉非数字 ,从大到小排序
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10196010.html
Copyright © 2011-2022 走看看