• 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;
        }
    };
    
  • 相关阅读:
    今日小结 5.7
    今日小结 5.2
    今日小结 4.30
    今日小结 4.29
    设计模式 笔记1
    第一次找实习
    Java入门 任务表
    今日小结 4.24
    今日小结 4.18
    今日小结 4.17
  • 原文地址:https://www.cnblogs.com/IzumiSagiri/p/15861396.html
Copyright © 2020-2023  润新知