LeetCode Maximum Product Subarray 解题报告

LeetCode Maximum Product Subarray 解题报告

大家好,又见面了,我是全栈君。

LeetCode 新题又更新了。求:最大子数组乘积。

https://oj.leetcode.com/problems/maximum-product-subarray/

题目分析:求一个数组,连续子数组的最大乘积。

解题思路:最简单的思路就是3重循环。求解productArray[i][j]的值(productArray[i][j]为A[i]到A[j]的乘积),然后记录当中最大值,算法时间复杂度O(n3)。必定TLE。

第一次优化,动态规划。求解:productArray[i][j]的时候不用再次循环从i到j。而是利用:productArray[i][j]=productArray[i][j-1]*A[j];採用递推的方法来计算,算法时间复杂度为O(n2),遗憾的是也TLE了。

public class Solution {
    public int maxProduct(int A[]) {
        if(A==null||A.length==0) {
	      return 0;
	    }
	    int[][] productArray =  new int[A.length][A.length];
	    int maxProduct = A[0];
	    
	    for(int i=0;i<A.length;i++) {
	    	for(int j=i;j<A.length;j++) {
	    		if(j==i) {
	    		    productArray[i][i] = A[i];
	    		} else {
	    		    productArray[i][j] = productArray[i][j-1]*A[j];
	    		}
	    		if(productArray[i][j]>maxProduct) {
	    			maxProduct = productArray[i][i];
	    		}
	    	}
	    }
	    return maxProduct;
    }
}

第二次优化。事实上子数组乘积最大值的可能性为:累乘的最大值碰到了一个正数;或者。累乘的最小值(负数),碰到了一个负数。所以每次要保存累乘的最大(正数)和最小值(负数)。同一时候另一个选择起点的逻辑。假设之前的最大和最小值同当前元素相乘之后,没有当前元素大(或小)那么当前元素就可作为新的起点。比如,前一个元素为0的情况,{1,0,9,2}。到9的时候9应该作为一个最大值,也就是新的起点。{1,0,-9,-2}也是相同道理,-9比当前最小值还小,所以更新为当前最小值。

这样的方法仅仅须要遍历一次数组就可以,算法时间复杂度为O(n)。

public class Solution {
    public int maxProduct(int A[]) {
        if(A==null||A.length==0) {
	      return 0;
	    }
	    int maxProduct = A[0];
	    int max_temp   = A[0];
	    int min_temp   = A[0];
	    
	    for(int i=1;i<A.length;i++) {
	    	int a = A[i]*max_temp;
	    	int b = A[i]*min_temp;
	    	max_temp = Math.max(Math.max(a,b), A[i]);
	    	min_temp = Math.min(Math.min(a,b), A[i]);
	    	maxProduct = Math.max(maxProduct, max_temp);
	    }
	    return maxProduct;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115679.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微生物组-宏基因组分析第8期 (报名直播课免费参加线下2020.7)[通俗易懂]

    微生物组-宏基因组分析第8期 (报名直播课免费参加线下2020.7)[通俗易懂]“福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析、宏基因组、Python课程和转录组的线上直播课。报名参加线上直播课的老师可在1年内选择参加同…

    2022年5月23日
    35
  • m3u8手机批量转码_M3U8批量转换app-M3U8批量转换MP4软件下载v1.0 安卓版-西西软件下载…

    M3U8批量转换MP4软件,一个简单高效的M3U8转MP4格式软件,支持一键批量转换,在安卓手机上进行操作,传输或者下载的M3U8格式视频文件一般无法打开浏览,直接在这里进行转换,可选择转换后删除源文件,直接获取到可以正常观看的MP4格式文件。本次放出M3U8批量转换app安卓版下载,想要一款批量格式转换工具的朋友们不妨试试吧!M3U8批量转换app介绍可将m3u8格式的AppleHLS加密视频…

    2022年4月13日
    98
  • html设置ie9兼容性视图,ie9兼容性设置在哪里 IE兼容性视图在哪里设置?「建议收藏」

    html设置ie9兼容性视图,ie9兼容性设置在哪里 IE兼容性视图在哪里设置?「建议收藏」找不到“兼容性视图设置”子菜单如何在360浏览器IE9上设置兼容性视图还有一种方法打开菜单栏,就是鼠标右键点击上方的空白处,选择“菜单栏”,然后菜单栏就显示“工具”。【兼容性视图设置】的窗口,选择“添加此网址”。IE兼容性视图设置在哪兼容性视图怎么设置在浏览器右上角的设置里设置,设置方法如下:方法1首先,打开电脑,找到电脑桌面上的IE浏览器,并点击打开,打开后,进入任一网页,找到页面右上方的…

    2025年10月9日
    2
  • iis命令停止启动_更新并重启怎么取消

    iis命令停止启动_更新并重启怎么取消直接使用CMD我们可以操作很多事情,比如启动IIS,重启IIS,停止IIS重启IIS服务器,开始->运行->cmd(以下列出相关操作命令):iisreset /RESTART停止后启动iisreset/START启动IIS(如果停止)iisreset/STOP停止IIS(如果启动)iisreset/REBOOT重启电脑iisreset/REB…

    2025年5月23日
    1
  • 大数据建模五步法「建议收藏」

    大数据建模五步法「建议收藏」from:https://www.sohu.com/a/198093510_783844前一阵子,某网络公司发起了一个什么建模大赛,有个学员问我,数据建模怎么搞?为了满足他的好学精神,我决定写这一篇文章,来描述一下数据分析必须要掌握的技能:数据建模。本文将尝试来梳理一下数据建模的步骤,以及每一步需要做的工作。01第一步:选择模型或自定义模式这是建模的第一步,我们需要基于…

    2022年4月29日
    342
  • 聚类分析的常用算法_聚类算法的基本原理

    聚类分析的常用算法_聚类算法的基本原理原博文:聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。聚类是一种无监督学习的方法,是许多领域中常用的统计数据分析技术。在数据科学中,我们可以使用聚类分析从我们的数据中获得一些有价值的见解。在这篇文章中,我们将研究5种流…

    2022年8月29日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号