1. 程式人生 > >最長子序列和

最長子序列和

  • 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.

    More practice:

    If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

  • 題目大意:求最長子序列和。給定一個至少包含一個數字的陣列,查詢最長子序列和。

    例如:給定的是陣列[−2, 1, −3, 4, −1, 2, 1, −5, 4],最大連續子序列是[4, -4, 2, 1],最長子序列和是6。

    更多練習:如果已經找到O(n)解決方案,嘗試使用分治法解決方案。

  • 思路:maxSum 必然是以A[i](取值範圍為A[0] ~ A[n-1])結尾的某段構成的,也就是說maxSum的candidate必然是以A[i]結果的。如果遍歷每個candidate,然後進行比較,那麼就能找到最大的maxSum了。
    假設把A[i]之前的連續段叫做sum。可以很容易想到:
    (1)如果sum>=0,就可以和A[i]拼接在一起構成新的sum。因為不管nums[i]多大,加上一個正數總會更大,這樣形成一個新的candidate。
    (2)反之,如果sum<0,就沒必要和A[i]拼接在一起了。因為不管A[i]多小,加上一個負數總會更小。此時由於題目要求陣列連續,所以沒法保留原sum,所以只能讓sum等於從A[i]開始的新的一段數了,這一段數字形成新的candidate。
    (3)如果每次得到新的candidate都和全域性的maxSum進行比較,那麼必然能找到最大的max sum subarray.在迴圈過程中,用maxSum記錄歷史最大的值。從A[0]到A[n-1]一步一步地進行。

  • 程式碼:

#include<iostream>
using namespace std;
int maxSubArray(int A[], int n)
{
    if(n == 0)return 0;
    int sum = A[0], maxsum = A[0];
    for(int i=1; i<n; i++)
    {
        if(sum >= 0)
        {
            sum += A[i];
        }
        else
        {
            sum = A[i];
        }
        maxsum = max(sum, maxsum);
    }
    return maxsum;
}
int main()
{
    int A[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
    cout<<maxSubArray(A, 9)<<endl;
    return 0;
}
  • 以上。

版權宣告:本文為博主原創文章,轉載請註明出處。
個人部落格地址:https://yangyuanlin.club
歡迎來踩~~~~