乘积最大子序列

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

示例 1:

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

输出: 6

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

示例 2:

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

输出: 0

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

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

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

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

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

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

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

记maxAll为全局最大乘积

 class Solution{
public:
int maxProduct(vector<int>& nums){
if (nums.empty()){
return 0;
}
if (nums.size() == 1){
return nums[0];
}
int maxAll = nums[0];//global maximum
int maxLast = nums[0];//maximum including last element
int maxCur;//maximum including current element
int minLast = nums[0];//minumum including current element
int minCur;//minimum including last element
for (int i = 1; i<nums.size(); i++){
maxCur = max(nums[i], max(maxLast*nums[i], minLast*nums[i]));
minCur = min(nums[i], min(maxLast*nums[i], minLast*nums[i]));
maxLast = maxCur;
minLast = minCur;
maxAll = max(maxAll, maxCur);
}
return maxAll;
}
};

最新文章

  1. IOAPIC重定位中断处理函数思路整理
  2. Centos系统下Lamp环境的快速搭建
  3. mysql group by后 拼接某一字段
  4. 单例实现c++
  5. 【转】Linux重定向操作符
  6. 【BZOJ-3165】Segment 李超线段树(标记永久化)
  7. 屠蛟之路_重伤的屠蛟俊_ThirdDay
  8. 自动布局之autoresizingMask
  9. Authentication in .NET Web Api
  10. FireDac 与数据库连接时字符集及对应的字段类型问题
  11. MyEclipse中使用debug调试程序
  12. SQL语句新建表,同时添加主键、索引、约束
  13. 异步消息总线hornetq学习-03客户端连接hornet进行jms消息的收发-非jndi方式连接
  14. js原型和原型链个人理解(我的理解)
  15. NAT( 网络地址转换) 实现
  16. python test0729.py
  17. PHP编程效率的20个要点--PHP技术教程分享
  18. 如何缩放SpriteBuilder中的scene
  19. 解决jequry使用keydown无法跳转的问题
  20. Node.js的单元测试框架初体验

热门文章

  1. Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)
  2. _bzoj1192 [HNOI2006]鬼谷子的钱袋【水题】
  3. sqlserver 使用database mail 发送邮件
  4. JEECMS9.3集成dubbo操作记录
  5. java 字符串的比较compareTo
  6. Snort里如何将一个tcpdump格式的二进制文件读取打印到屏幕上(图文详解)
  7. AJPFX实列判断一个字符串是不是对称字符串
  8. CSS综合用法
  9. [Tunny]CSS LESS框架基础
  10. html中 accept 属性