※ Leetcode - Dynamic Programming - 53.Maximum Subarray(最大連續和)+152.Maximum Product Subarray(最大連續積)

1. Problem Description of 53.Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

 

For example, given the array [2,1,3,4,1,2,1,5,4],

the contiguous subarray [4,1,2,1] has the largest sum = 6.

求一個數組的最大連續和

 

2. My solution

這類問題需要關注的核心問題是:

 

局部最優解如何求得,和全局最優解的關係(狀態轉移方程的確定)

 

該題的狀態轉移方程,僅考慮兩個值得大小:Local[i-1]+nums[i]nums[i]

因此:Local[i]=max([i-1]+nums[i],nums[i])

  int maxSubArray(vector<int>& nums)
    {
        vector<int>local;
        int len=nums.size();
        //range of int:-(1<<31)~(1<<31)-1
        
        if(len==1)
            return nums[0];
        local.push_back(nums[0]);
        int global=local[0];
        for(int i=1; i<len; i++)
        {
           local.push_back(max(local[i-1]+nums[i],nums[i]));
           global=max(global,local[i]);
        }
        return global;
    }

3. Problem Description of 152. Maximum Product Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

 

For example, given the array [2,3,-2,4],

the contiguous subarray [2,3] has the largest product = 6.

求數組中元素的最大連續積。

4. My solution

題目與最大連續和的區別關鍵在於我們不能只考慮前一個最大數與當前數的和。

因爲負數的存在,很可能一個絕對值較大的負數,和一個負數相乘得到一個很大的證書。

所以除了記錄局部最大值,我們還應該記錄局部最小值。

因爲nums[i]的正負未知,我們直接把前一個局部最大值和局部最小值分別與nums[i]相乘。

得到:

 int tmin=minlocal[i-1]*nums[i];

 int tmax=maxlocal[i-1]*nums[i];

最後當前的局部最大值和局部最小值,通過比較三個數得到:

Tmin,tmax,nums[i]

然後更新global值就可以啦~


  int maxProduct(vector<int>& nums)
    {
        int len=nums.size();
        if(len==1)
            return nums[0];
        vector<int>minlocal;
        vector<int>maxlocal;
 
        minlocal.push_back(nums[0]);
        maxlocal.push_back(nums[0]);
        int global=nums[0];
 
        for(int i=1; i<len; i++)
        {
            int tmin=minlocal[i-1]*nums[i];
            int tmax=maxlocal[i-1]*nums[i];
            minlocal.push_back(min(min(tmin,tmax),nums[i]));
            maxlocal.push_back(max(max(tmin,tmax),nums[i]));
            global=max(maxlocal[i],global);
        }
        return global;
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章