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])
- 如果