152. Maximum Product Subarray

為了求最后的乘積最大,我們先看看最后的結果是通過怎樣的比較產生的。舉個例子nums[3] => nums[0],nums[1],nums[2].
我們有個local的最大和global的最大。global_max即本題結果。local_max指的是以nums[i] 為結尾的array的最大乘積,其只有兩種可能:

  • nums[i]與之前的local_max 相乘, 即local_max * nums[i]
  • 當然,也可以選擇不與之前的相乘,即nums[i]

然而本題還要考慮負數(shù)的情況,則最大值也有可能是local_min * nums[i]得到的,同時我們也得維護local_min , 所以狀態(tài)轉移公式如下:

  • local_max = max { nums[i], local_max * nums[i], local_min * nums[i] }
  • local_min = min { nums[i], local_max * nums[i], local_min * nums[i] }
  • global_max = max { global_max, local_max }

代碼:

//  main.cpp
//  leetcode
//
//  Created by YangKi on 15/11/19.
//  Copyright ? 2015年 YangKi. All rights reserved.
#include<vector>
#include<algorithm>
#include<cstdio>
#include <unordered_map>
#include <cmath>
using namespace std;

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int size = (int)nums.size();
        
        if (size == 0) return 0;
        if (size == 1) return nums[0];
        
        int global_max = nums[0];
        int local_max = nums[0];
        int local_min = nums[0];
        
        for (int i = 1; i <= size - 1 ; i++)
        {
            int temp_local_max = max(max(local_max * nums[i], nums[i]), local_min * nums[i]);
            int temp_local_min = min(min(local_max * nums[i], nums[i]), local_min * nums[i]);;
            local_max = temp_local_max;
            local_min = temp_local_min;
            
            global_max = max(local_max, global_max);
        }
        
        return global_max;
        
    }
    
private:
    int max(int a, int b)
    {
        return a > b? a : b;
    }
    
    int min(int a, int b)
    {
        return a < b? a : b;
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容