2017-02-23 57 views
0

查找具有最大總和的數組中的連續子數組(至少包含一個 數字)。需要的最大子數組提示

例如,給定數組[-2,1,-3,4,-1,2,1,-5,4],連續的 子數組[4,-1,2,1]具有最大的總和= 6.

我無法解決這個問題,但我只是想一些提示。

它說這可以使用動態規劃解決,但我很努力地看到一個連接。

DP連接將採用整個數組的總和嗎?

+0

HTTPS://en.m。 wikipedia.org/wiki/Maximum_subarray_problem –

+1

可能的重複[最大總和連續子數組(面試問題)](http://stackoverflow.com/questions/5378273/largest-sum-contiguous-subarray-interview-question) – putonspectacles

+0

這裏是一個提示爲你。假設你的數組是'A [n]'。現在構建另一個數組'B [n]',使得'B [k]'包含'A'中的連續子數組,其中最大和開始*正好*在'A [k]'處。而且,由於它在DP中是典型的,所以從末尾開始構建它 - 「B [n]」顯然只是一個元素數組「A [n]」。知道了,你能確定'B [n-1]'嗎?... – avysk

回答

0
max; 
max_ele; 
for (i=0; i< i++) { 
    if (i ==0) { 
    max_ele = i; 
    max =a[i]; 

} else if (max < max + a[i]) { 
    max - max + a[i]; 
    max_ele = i; 
} else { 
    max = 0; 
} 
} 

you get max_ele after this iteration, trace back till negative element or first element to get max. 
0

您的問題的參考可以找到here

必須使用Kadane的算法來解決這樣的情況下,它是這樣的:

Initialize: 
    max_so_far = 0 
    max_ending_here = 0 

Loop for each element of the array 
    (a) max_ending_here = max_ending_here + a[i] 
    (b) if(max_ending_here < 0) 
     max_ending_here = 0 
    (c) if(max_so_far < max_ending_here) 
     max_so_far = max_ending_here 
    return max_so_far 

,供大家參考示例代碼:

static int maxSubArraySum(int a[]) 
{ 
    int size = a.length; 
    int max_so_far = Integer.MIN_VALUE, max_ending_here = 0; 

    for (int i = 0; i < size; i++) 
    { 
     max_ending_here = max_ending_here + a[i]; 
     if (max_so_far < max_ending_here) 
      max_so_far = max_ending_here; 
     if (max_ending_here < 0) 
      max_ending_here = 0; 
    } 
    return max_so_far; 
}