LeetCode 152 乘积最大子数组

题目链接:LeetCode 152 乘积最大子数组

题目大意:
给你一个整数数组\(nums\),请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

题解:
由于数组中存在负数,所以需要同时记录当前最大值和当前最小值。
设\(maxAns[i]\)表示以第\(i\)个元素结尾的乘积最大子数组的乘积,\(minAns[i]\)表示以第\(i\)个元素结尾的乘积最小子数组的乘积。
状态转移方程:

\[\left\{ \begin{array}{l} maxAns[i] = max\{maxAns[i - 1] \times nums[i], minAns[i - 1] \times nums[i], nums[i]\} \\ minAns[i] = min\{maxAns[i - 1] \times nums[i], minAns[i - 1] \times nums[i], nums[i]\} \end{array} \right. \]

由于\(maxAns[i]\)和\(minAns[i]\)仅与\(maxAns[i - 1]\)和\(minAns[i - 1]\)有关,所以可以使用滚动数组压缩空间。

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int maxAns, minAns, ans;
        maxAns = minAns = ans = nums[0];
        for (int i = 1; i < nums.size(); ++i) {
            int maxn = maxAns, minn = minAns;
            maxAns = max(nums[i], max(maxn * nums[i], minn * nums[i]));
            minAns = min(nums[i], min(maxn * nums[i], minn * nums[i]));
            ans = max(ans, maxAns);
        }
        return ans;
    }
};
上一篇:配置Django框架虚拟环境


下一篇:C/C++中的联合体