LeetCode OJ 152. Maximum Product Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.
【题目分析】
给定一个整数数组,找出数组中的一个子序列,使得序列中所有元素的乘积最大。
【思路】
观察发现数组中的元素可以分为三类:正数,负数和零。我们找到如下几种情况:
情况1:数组中没有0元素,而且数组中负数的个数为偶数。
解决方法:直接返回数组中各个元素的乘积;
情况2:数组中没有0元素,而且数组中负数的个数为奇数。
解决方法:计算第一个负数数之后所有元素的乘积pro1和最后一个负数之前的所有元素乘积pro2,返回较大值。
情况3:数组中含有0元素。
解决方法:用0元素把数组分为若干段,对每一段使用情况1和情况2中的方法进行处理。
【java代码】
public class Solution {
public int maxProduct(int[] nums) {
if(nums.length == 0) return 0;
int prezero = -1, curzero = -1;
int maxpro = Integer.MIN_VALUE;
for(int i = 0; i < nums.length; i++){ //找到数组中的0元素,把数组分为不包含0的若干段进行处理
if(nums[i] == 0){
prezero = curzero;
curzero = i;
maxpro = Math.max(product(nums, prezero+1, curzero-1), maxpro);
}
}
if(curzero < nums.length - 1) maxpro = Math.max(product(nums, curzero+1, nums.length-1),maxpro);
if(maxpro > 0 || curzero == -1) return maxpro; //如果最大值大于零或者数组中没有0,直接返回找到的最大值
else return 0; //否则返回0,此时maxpro<=0 && curzero != 0
}
public int product(int[] num, int start, int end){
if(start > end || start < 0 || end < 0) return Integer.MIN_VALUE;
int firstneg = -1, lastneg = -1, pro = 1; //firstneg表示第一个负数的下标,lastneg表示最后一个负数的下标
for(int i = start; i <= end; i++){
pro *= num[i];
if(num[i] < 0){
if(firstneg == -1) firstneg = i;
lastneg = i;
}
}
if(pro > 0 || start == end) return pro; //如果找到的值大于零或者数组中只有一个元素则直接返回结果
int pro1 = pro, pro2 = pro; //否则计算第一个负数数之后所有元素的乘积pro1和最后一个负数之前的所有元素乘积pro2
for(int i = start; i <= firstneg; i++){
pro1 /= num[i];
}
for(int i = lastneg; i <= end; i++){
pro2 /= num[i];
}
return pro1 > pro2 ? pro1 : pro2; //返回较大值
}
}
效果:

LeetCode OJ 152. Maximum Product Subarray的更多相关文章
- 【刷题-LeetCode】152 Maximum Product Subarray
Maximum Product Subarray Given an integer array nums, find the contiguous subarray within an array ( ...
- [LeetCode]152. Maximum Product Subarray
This a task that asks u to compute the maximum product from a continue subarray. However, you need t ...
- 【LeetCode】152. Maximum Product Subarray 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 动态规划 参考资料 日期 题目地址:htt ...
- 【LeetCode】152. Maximum Product Subarray
题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...
- LeetCode OJ:Maximum Product Subarray(子数组最大乘积)
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- leetcode 53. Maximum Subarray 、152. Maximum Product Subarray
53. Maximum Subarray 之前的值小于0就不加了.dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值. 动态规划的方法: class Solution { public: ...
- 152. Maximum Product Subarray - LeetCode
Question 152. Maximum Product Subarray Solution 题目大意:求数列中连续子序列的最大连乘积 思路:动态规划实现,现在动态规划理解的还不透,照着公式往上套的 ...
- 求连续最大子序列积 - leetcode. 152 Maximum Product Subarray
题目链接:Maximum Product Subarray solutions同步在github 题目很简单,给一个数组,求一个连续的子数组,使得数组元素之积最大.这是求连续最大子序列和的加强版,我们 ...
- [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
随机推荐
- java error:编码gbk的不可映射字符
解决方法: javac -encoding UTF-8 XX.java
- mybatis学习笔记三(关联关系)
学习mybatis的关联关系,主要注解在代码上,这里不做解释.配置文件一样的就不贴了 1.关联关系表创建(学生对应老师 多对一) 学生老师表 2.表对应的实体类 package com.home.en ...
- log4j基本使用方法
通过配置文件可知,我们需要配置3个方面的内容: 1.根目录(级别和目的地) 2.目的地(控制台和文件等) 3.输出样式 Log4j由三个重要的组件构成: 1.日志信息的优先级 日志信息的优先级从高到低 ...
- ngDialog 设置其宽度大小
[ngdialog弹窗大小设置(angularjs)] 方法一:添加css样式属性 css: .ngdialog.ngdialog-theme-plain.custom-width-70 .ngdia ...
- XTU 1245 Hamiltonian Path
$2016$长城信息杯中国大学生程序设计竞赛中南邀请赛$C$题 简单题. 注意题目中给出的数据范围:$1 \le ai < bi \le n$,说明这是一个有向无环图,并且哈密顿路一定是$1 \ ...
- .net core 11
- Python之软件管理
常用软件包管理工具 一般python软件包管理工具,主要有以下: 图 常用python包管理工具 可以看到distribute是setuptools的替代方案(因为Setuptools包不再维护了), ...
- magento里get与post传值如何接收
$this->getRequest()->getParam('customer_id');这个方法就是获取post和get的值就不用$_POST['']了.$this->getReq ...
- Spring Security(15)——权限鉴定结构
目录 1.1 权限 1.2 调用前的处理 1.2.1 AccessDecisionManager 1.2.2 基于投票的AccessDecisionManager实 ...
- vue实例生命周期
实例生命周期 var vm = new Vue({ data: { a: 1 }, created: function () { // `this` 指向 vm 实例 console.log('a i ...