Maximum Product Subarray
打卡,第9天
今天这道题做了好久。。。
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.
看到这道题,就让我想起了昨天做得那道Longest Substring Without Repeating Characters。
看起来很像是同一类的题目,想着用同一种方法去做,然后就考虑了好多奇奇怪怪的情况,最后代码写的及其混乱。
| 1 | int maxProduct(vector<int>& nums) { | 
这还是做完后进行了一些删减的答案,看起来很复杂,要我现在去解释它都有点困难。
先提提我的思路:
- 和昨天的一样,我用两个下标来标识当前 - Subarray,也就是说,然后让- j不断向前去遍历。
- 我需要考虑的就是什么时候 - i向前,我的想法是:- 当我们遇到一个0时,我们需要把i改成j+1,因为正常情况下 - Subarray中如果有个- 0,那么- Subarray的乘积就必定是0,为什么说是正常情况呢,因为如果当前最大乘积小于0的话,那么我们遇到一个- 0,要把最大乘积改成- 0.
- 但是如果我们遇到这样的数组 - 2 -1 4 0,我们当前的策略的返回值是- 2,但真正应该是4,因此另一个- i向前的情况是:- 遇到一个 - 0或遍历完整个数组,我们需要让- i向前移动,直到让当前乘积变成大于0,或者到达- j。
最后将这一大段思路变成代码就成了我上面写的了,其实仔细想想,这些思路其实并不复杂,只是有点繁琐,如果心能静点的话,应该可以更快的AC掉这道题。
下面是dicuss中的方法:
| 1 | int maxProduct(int A[], int n) { | 
把注释去掉话,其实没几句话,说实话,第一次看没看懂,分析一下他的思路:
- 同样是遍历,但是它维护的不是下标,而是在A[0:j]中的子数组的最大值imax和子数组最小值imin. 
- 他用的是减治法,大概的想法是,我们知道A[0:n-1]imax和imin,我们如果求出A[0:n]的 - imax,imin。- 如果A[n]>=0,那么imax = max(A[n],imax*A[n]);imin = min(A[n],imin*A[n])
- 如果A[n] < 0,那么imin = min(A[n],imax*A[n]);imax = max(A[n],imin*A[n])
 
- 如果