zoukankan      html  css  js  c++  java
  • LeetCode -- 最大连续乘积子序列


    问题描写叙述: 给定数组,找出连续乘积最大值的子序列。
    比如 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;
        }
    }


  • 相关阅读:
    基于go语言的消息推送系统架构分析
    golang IDE 工具liteide打开报错解决方法
    centos 安装ffmpeg 并生成文件截图
    android 微信分享
    函数编程之闭包漫谈(Closure)
    2017-06-26
    本周总结
    一周总结
    一周总结
    一周总结
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6941649.html
Copyright © 2011-2022 走看看