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;
}

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 11,573评论 0 33
  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 862评论 0 4
  • 我们总是认为很多事情都是理所应当。然而,哪有那么多的所以然,什么都没有。没有故事,没有酒,没有情也没有爱。
    QH_DC阅读 68评论 0 0
  • 你好啊,准六月。时间不知不觉这么快悄然已至热夏。 我在武汉三个半月了。也是5月底了。想来到简书走一走了。 真好啊。...
    Jila阅读 37评论 0 0
  • 先上一组图。 看了以上的图有何感想?是不是很想把这个小子扔出去? 做为近期热议的话题---- 评论堆成山。 有人骂...
    爱美丽大妞爱思考阅读 269评论 0 0