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;}
}

LeetCode Maximum Product Subarray 解题报告相关推荐

  1. LeetCode Maximum Product Subarray(最大子数组乘积)

     Find the contiguous subarray within an array (containing at least one number) which has the large ...

  2. LeetCode: Maximum Product Subarray

    很久没练只能看别人代码了 1 class Solution { 2 public: 3 int maxProduct(int A[], int n) { 4 if (n == 0) return 0; ...

  3. 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大

    Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containin ...

  4. LeetCode 152. Maximum Product Subarray

    152. Maximum Product Subarray Find the contiguous subarray within an array (containing at least one ...

  5. 【LeetCode】152. Maximum Product Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  6. 【LeetCode】3Sum Closest 解题报告

    [题目] Given an array S of n integers, find three integers in S such that the sum is closest to a give ...

  7. LeetCode Maximum Product of Word Lengths(位操作)

    问题:给出一个字符串数组,要求求出两个没有共同字符的字符串的最大积 思路:第一种方法是直接枚举任意两个字符串,看是否有公共字符,如果没有,则计算乘积,并更新最大值. 第二种方法,因为字符范围是a-z, ...

  8. Maximum Product Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  9. LeetCode: Maximum Subarray 解题报告

    Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...

最新文章

  1. 基于django的视频点播网站开发-step12-后台订阅功能
  2. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第1章-绪论
  3. 减一天_一个动作减全身,一天比一天瘦,比跑3000米效果还好
  4. 总结面试题——Javascript
  5. junit测试方法_JUnit测试方法订购
  6. cmake取消宏定义_Excel基础丨取消excel中宏安全提示框
  7. 1064金明的预算方案
  8. c语言程序设计小学期论文,c语言程序设计小学期.pdf
  9. javascript动态字母
  10. D3实战(1):力导向图
  11. 查看sql语句执行时间/测试sql语句性能
  12. 网络层-IP地址和MAC地址
  13. 【OCP题库-12c】最新CUUG OCP 071考试题库(71题)
  14. Scrapy框架爬取豆瓣电影top250信息
  15. 压缩包文件的解压密码如何破解
  16. DNS 的工作原理——域名系统
  17. 关于医学影像中的轴位面(横断面)、冠状面、矢状面
  18. 我的python学习之路
  19. HTML跨年代码[源码]
  20. 使用笔记:AWTK中文键盘按键字体加大

热门文章

  1. java程序员就业发展方向_Java程序员有哪些职业发展方向?
  2. mysql的分类有哪些_MYSQL查询所有的分类,以及每个分类下面所有的文章?
  3. 字典 选取前100_100道 Python 经典练习题004
  4. groupadd r mysql_MySQL三种安装方式大揭秘
  5. python 调用 .netcore api_浅谈Python调用XBee的API来进行通讯
  6. 语义分割和实例分割_2019 语义分割指南
  7. 360压缩电脑版_震惊!360竟然出了一款这么良心的软件
  8. delphi 检测网络是否连通_WebRTC:连接建立过程的网络穿透
  9. 系统学习NLP(十二)--文本表示综述
  10. 目标检测(二十三)--DenseBox