Leetcode. 数组中子数组的最大累乘积

问题

给定一个double类型的数组arr, 其中的元素可正, 可负, 可0, 返回子数组累乘的最大乘积.

例如, arr = [-2.5, 4, 0, 3, 0.5, 8, -1], 子数组{3, 0.5, 8}累乘可以获得最大的乘积12, 所以返回12.

分析

最大累乘积, 就是在以每个元素arr[i], 0=<i<= size-1 为结尾的子数组的最大累乘积中, 最大的值.
以arr[i]为结尾的累乘积由三种情况, 从这三种情况中选择最大的作为当前最大累乘积:

  1. curMax * arr[i], curMax为以arr[i-1]为结尾的最大累乘积. 如数组[1, 2, 3, 4], 当i = 3时, curMax = 1 * 2 * 3 = 6. curMax * arr[3] = 24
  2. curMin * arr[i], curMin为以arr[i-1]为结尾的最小累乘积, 考虑到的情况是curMin为负数, 并且arr[i]也为负数的场景. 如数组[1,2,-3,-4], 当i = 3时, curMin = 1 * 2 * -3 = -6, curMin * arr[i] = -6 * -4 = 24
  3. arr[i], 最大累乘积是arr[i]自身, 如数组[1, 2, -3], 以-3结尾的最大累乘积为 -3
class Solution
{
public:
    double maxMulti(std::vector<double>& nums)
    {   
        if (nums.size() == 0)
        {   
            return 0;
        }   
        double curMax = nums[0];
        double curMin = nums[0];
        double result = nums[0];
        for (std::vector<double>::iterator cur = nums.begin() + 1; cur < nums.end(); ++cur)
        {   
            double cand1 = curMax * *cur;
            double cand2 = curMin * *cur;
            double cand3 = *cur;
            curMax = std::max(cand1, std::max(cand2, cand3));
            curMin = std::min(cand1, std::min(cand2, cand3));
            result = std::max(curMax, result);
        }   
        return result;
    }   
};

int main()
{
    Solution solution;
    std::vector<double> nums = {-2.5, 4, 0, 3, 0.5, 8, -1};
    std::cout << solution.maxMulti(nums) << std::endl;
}
    原文作者:周肃
    原文地址: https://www.jianshu.com/p/315b27d00c19
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞