LeetCode -- 最大连续乘积子序列
2015-07-23 11:39
363 查看
问题描述: 给定数组,找出连续乘积最大值的子序列。
例如 0,-1,-3,-2,则最大连续乘积为6= (-3) * (-2)
实现思路
此题与最大连续和的子序列问题类似,也可通过找到递推公式然后用DP来解。
关键在于求公式的过程要考虑到元素可能为负的情况。假设元素都为正数的话,DP公式为:
dp[i] = max(a[i],dp[i-1]*a[i]) ,乘或不乘,取最大的那个
可元素可能为负数,因此可以使用min和max分别存当前最大值和最小值,如果当前元素为负数的话,当前最小值就成了最大值。这样一来,dp公式为:
max = Max(Max(max * a[i], min * a[i]), a[i]) ,先从max * a[i]和min * a[i]找出最大值,在与a[i]进行比较
min = Min(Min(max * a[i], min * a[i]), a[i]) ,同上,只是取的是最小值
最后的max即为所求
例如 0,-1,-3,-2,则最大连续乘积为6= (-3) * (-2)
实现思路
此题与最大连续和的子序列问题类似,也可通过找到递推公式然后用DP来解。
关键在于求公式的过程要考虑到元素可能为负的情况。假设元素都为正数的话,DP公式为:
dp[i] = max(a[i],dp[i-1]*a[i]) ,乘或不乘,取最大的那个
可元素可能为负数,因此可以使用min和max分别存当前最大值和最小值,如果当前元素为负数的话,当前最小值就成了最大值。这样一来,dp公式为:
max = Max(Max(max * a[i], min * a[i]), a[i]) ,先从max * a[i]和min * a[i]找出最大值,在与a[i]进行比较
min = Min(Min(max * a[i], min * a[i]), a[i]) ,同上,只是取的是最小值
最后的max即为所求
public class Solution { public int MaxProduct(int[] nums) { var len = nums.Length; if(len == 0) { return 0; } var max = nums[0]; var min = nums[0]; var result = nums[0]; for(var i = 1;i < len; i++){ var tmpMax = Math.Max(Math.Max(max * nums[i] , min * nums[i]), nums[i]); var tmpMin = Math.Min(Math.Min(max * nums[i] , min * nums[i]), nums[i]); max = tmpMax; min = tmpMin; result = Math.Max(result , max); } return result; } }
相关文章推荐
- IOS-内存分区
- Apache2.4开启GZIP功能
- c#的js调用后台多维数组
- 手机站百度地图一键导航代码
- 悬浮窗与Home Back事件
- 中文化和国际化问题权威解析之三:Java中文问题分析
- windows下配置nginx+php环境
- 简易命令行界面的C/S聊天室
- iOS 图片设置为圆角矩形,圆形等
- 通用的CMyStack类
- 数据库基础:连接查询总结
- 【iOS学习】四、内存管理相关
- 还原反编译后AndroidManifest.xml乱码为明文
- VS2010关于调用ffmpeg借口出错
- 自定义照相机实现前后切换摄像头以及拍照预览各种问题解决
- 7.23翻倍奖励——滴滴快车单(成交率≥90%,≥15指派单)
- 【转】搞定单片机多字节串口接收(串口多字节接收发送的高阶研究)
- cell前面添加一个图片
- vim的列模式
- Golang Channel用法简编