LintCode:M-乘积最大子序列
来源:互联网 发布:怎样金融网络投资 编辑:程序博客网 时间:2024/06/04 18:52
LintCode:链接
找出一个序列中乘积最大的连续子序列(至少包含一个数)。
样例
比如, 序列 [2,3,-2,4]
中乘积最大的子序列为 [2,3]
,其乘积为6
。
当全部为正数的时候,乘积肯定为最大,但是由于有负数出现,只有偶数情况的负数才能转正
所以前面乘积的负数在未来可能变成最大,所以需要分别记录 i 之前的连续乘积的最大和最小值
public class Solution { /* * @param nums: An array of integers * @return: An integer */ //最大积、最小积 public int maxProduct(int[] nums) { int n = nums.length; int minMul = nums[0]; int maxMul = nums[0]; int max=maxMul; for(int i=1; i<n; i++){ //maxMul=max(自身,和i前最小积的乘积,和i前最大积的乘积) int tMaxMul = maxMul; int tMinMul = minMul; maxMul = Math.max(nums[i], Math.max(nums[i]*tMinMul, nums[i]*tMaxMul)); minMul = Math.min(nums[i], Math.min(nums[i]*tMinMul, nums[i]*tMaxMul)); max = Math.max(max, maxMul); } return max; } //暴力,超内存 public int maxProduct_enum(int[] nums) { int n = nums.length; //dp[i][j]表示i~j区间的最大乘积 int[][] dp = new int[n][n]; int max=Integer.MIN_VALUE; for(int len=1; len<=n; len++){ for(int i=0; i+len-1<n; i++){ int j = i+len-1; //dp[i][j] = nums[j]; if(i==0) dp[i][j] = (j==0?1:dp[i][j-1])*nums[j]; else if(i==j){ dp[i][j] = nums[j]; }else{ if(nums[i-1]==0){ dp[i][j]=dp[i][j-1]*nums[j]; }else{ dp[i][j]=dp[i-1][j-1]/nums[i-1]*nums[j]; } } max = Math.max(max, dp[i][j]); } } return max; }}
阅读全文
0 0
- LintCode:M-乘积最大子序列
- LintCode-乘积最大子序列
- LintCode -- 乘积最大子序列
- lintcode- 乘积最大子序列
- LintCode:乘积最大子序列
- 乘积最大子序列,lintcode
- lintcode--乘积最大子序列
- Lintcode 乘积最大子序列
- 乘积最大子序列-LintCode
- lintcode--乘积最大子序列
- lintCode【91】乘积最大子序列
- [Lintcode]Maximum Product Subarray乘积最大子序列
- lintcode刷题——乘积最大子序列
- 最大乘积子序列
- 最大子序列乘积
- 乘积最大子序列
- 乘积最大子序列
- 乘积最大子序列
- RecyclerView改造成ViewPager思路
- java http请求中解决跨域问题
- python pickle
- 高性能流媒体服务器EasyDSS前端重构(二) webpack + vue + AdminLTE 多页面提取共用文件, 优化编译时间
- HDU6181 Two Paths【次短路】
- LintCode:M-乘积最大子序列
- I2C总线协议
- pandas读取出错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0
- virtualBox虚拟机网络设置(四种方式)
- 使用谷歌调试手机出现空白页问题
- sdp开发
- Linux——Shell学习笔记2
- 美团 Cat 源码文章
- 破解Navicat for MySQL