題目: LeetCode - 152. Maximum Product Subarray

題目說明

給一個陣列,求陣列中最大的子陣列乘積。

解題思路

由於是乘積,極小值乘以負數時會變為極大值,所以需要同時保存目前的子陣列乘積最大值及最小值。使用動態規劃的概念,最大值為 mx * nums[i]nums[i] 兩者取較大者,最小值為 mn * nums[i]nums[i] 兩者取較小者,若是碰到目前元素為負數時,則需要將兩者互換再去判斷。

參考解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int maxProduct(vector<int>& nums)
{
int mx = nums[0], mn = mx, res = mx, n = nums.size();
for(int i = 1; i < n; ++i)
{
if(nums[i] < 0) swap(mx, mn);
mx = max(mx * nums[i], nums[i]);
mn = min(mn * nums[i], nums[i]);
res = max(res, mx);
}
return res;
}
};