152. Maximum Product Subarray
来源:互联网 发布:知乎 堵门 编辑:程序博客网 时间:2024/04/26 08:33
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
.
乘到0肯定是会变0的,先找一段没有0的序列来看看,乘法负负得正,所以应该尽可能地多取元素才能使乘积最大,如果负数有偶数个,那么取全部元素就可以了,如果负数有奇数个,需要舍弃一部分,舍弃的这一部分一定是要么靠近左端点要么靠近右端点包含第一个负数的区间。做法就是按0把数组切开,每部分分别处理求最大。
public int maxProduct(int[] nums){int len=nums.length;if(len<2)return nums[0];int[] zeroindex=new int[len+2];zeroindex[0]=-1;int cnt=1;for(int i=0;i<len;i++)if(nums[i]==0)zeroindex[cnt++]=i;zeroindex[cnt++]=len;int max=0;for(int i=0;i<cnt-1;i++){int left=zeroindex[i];int right=zeroindex[i+1];if(right-left>=2)max=Math.max(max, maxproductaux(nums, left+1, right-1));}return max;}public int maxproductaux(int[] nums,int start,int end){if(start==end)return nums[start];int negcount=0;int firstneg=-1;int lastneg=-1;int mul=1;for(int i=start;i<=end;i++){if(nums[i]<0){lastneg=i;if(firstneg==-1)firstneg=i;negcount++;}mul*=nums[i];}if(negcount%2==0)return mul;int a=mul;int b=mul;for(int i=firstneg;i>=start;i--)a/=nums[i];for(int i=lastneg;i<=end;i++)b/=nums[i];return Math.max(a, b);}
----------------------------------------------------------------------------------------------------------
摘一个DP的解法,摘自:
http://www.cnblogs.com/ganganloveu/p/4089925.html
http://blog.csdn.net/salutlu/article/details/39560795
Analysis:
similar like Maximum Subarray question
difference is the max value could be get from 3 situations
current maxValue * A[i] if A[i]>0
current minValue * A[i] if A[i]<0
A[i]
We need to record current maxValue, current minValue and update them every time get the new product
class Solution {public: int maxProduct(vector<int>& nums) { if(nums.empty()) return 0; if(nums.size() == 1) return nums[0]; int maxAll = nums[0]; //global maximum int maxLast = nums[0]; //maximum including last element int maxCur; //maximum including current element int minLast = nums[0]; //minimum including current element int minCur; //minimum including last element for(int i = 1; i < nums.size(); i ++) { maxCur = max(nums[i], max(maxLast*nums[i], minLast*nums[i])); minCur = min(nums[i], min(maxLast*nums[i], minLast*nums[i])); maxLast = maxCur; minLast = minCur; maxAll = max(maxAll, maxCur); } return maxAll; }};
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- Git入门学习和使用
- 【Qt学习笔记】——控制台Hello World代码
- ghost使用经验分享:限制ghost32的功能的方法
- MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法
- Java中的集合
- 152. Maximum Product Subarray
- 范围for
- [leetcode]55. Jump Game ,C++/PYTHON实现,medium难度
- iOS Documents、Library跟tmp的作用
- 算法导论第6章堆排序
- 游戏工具类
- 数据库死锁的解决办法
- 安卓 文件管理器-ListView实现
- 最长公共子序列nyoj