1. 程式人生 > >Crack LeetCode 之 152. Maximum Product Subarray

Crack LeetCode 之 152. Maximum Product Subarray

原題

下文除了程式碼部分外,整理自link

這道題跟Maximum Subarray類似,還是用一維動態規劃中的“區域性最優和全域性最優法”。區別在於累乘和累加的性質不一樣,累乘需要考慮負數的情況。如果前一個迭代的累乘結果為負數並且當前的元素也為負數的話,那麼當前元素與前一個累乘結果相乘可能會得到最大值。因此我們在維護一個區域性最大值的同時也得維護一個區域性最小值。以下是C++程式碼,時間複雜度為O(n),空間複雜度為O(1)。

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        if (nums.empty())
            return 0;

        int global = nums[0];
        int local_max = nums[0];
        int local_min = nums[0];
        for (int i = 1; i<nums.size(); ++i) {
            int current_max = max(nums[i], max(local_max * nums[i], local_min * nums[i]));
            int current_min = min(nums[i], min(local_max * nums[i], local_min * nums[i]));

            local_max = current_max;
            local_min = current_min;
            global = max(global, local_max);
        }

        return global;
    }
};