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 };
  • 相关阅读:
    C#的集合类(二)Hashtable、SortedList、Dictionary
    下载文件-JavaScript
    ASP.NET(C#)图片加文字、图片水印
    C# DataTable 互转 List<T>
    C# 将 DataTable 转 List<T>、首行转 T
    C# 金额转中文大写
    监听端口守护进程
    数据库操作的九大步骤
    日志方法
    sqlserver 查找所有子级
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10196010.html
Copyright © 2011-2022 走看看