53 Maximum Subarray最大子串和

2021-07-02 20:03:49 字數 1371 閱讀 8868

題目:

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.題解:

比較經典的乙個問

題,是學習的好材料。

解1:窮舉,o(n²)複雜度,意料中的超時。

public class solution 

return maxsub;

}}

kadane演算法 :原理:

將陣列從左到右分割為若干子串,使得除了最後乙個子串之外,其餘子串的各元素之和小於0,且對於所有子串nums[i...j]和任意k(i<=k<j),有nums[i...k]的和大於0。滿足條件的和最大子串,

只能是上述某個子串的字首,而不可能跨越多個子串。

原理詳細可參考:

執行流程:從頭到尾遍歷目標陣列,將陣列分割為滿足上述條件的子串,同時得到各子串的最大字首和,然後比較各子串的最大字首和,得到最終答案。

以array=為例,通過遍歷,可以將陣列分割為如下3個子串(-2),(1,-3),(4,-1,2,1,-5,4),這裡對於(-2)這樣的情況,單獨分為一組。各子串的最大字首和為-2,1,6,所以目標串的最大子串和為6。

public class solution   

return max_so_far;

}}

解3:分治法:

最大子串和的區間有以下三種情況(low,high分別為左右邊界,mid為(low+high)/2):

(1) 區間完全在 a[low,mid-1];

(2) 

區間完全在

a[mid+1,high];

(3) 區間包含有 a[mid],

等價於從中間元素開始往左累加的最大值 + 從中間元素開始往右累加的最大值

public class solution 

public int divide(int nums, int low, int high)

tmp = mmax;

for(int i = mid+1; i <= high; i++)

return math.max(mmax, math.max(lmax, rmax));

}}

最大子串和問題(Maximum Subarray)

又乙個經典問題,對於乙個包含負值的數字串array 1.n 要找到他的乙個子串array i.j 0 i j n 使得在array的所有子串中,array i.j 的和最大。這裡我們需要注意子串和子串行之間的區別。子串是指數組中連續的若干個元素。子串行只要求各元素的順序與其在陣列中一致,而沒有連續的...

演算法題LC97 maximum subarray

貪心 題目描述 請計算給出的陣列 至少含有乙個數字 中具有最大和的子陣列 子陣列要求在原陣列中連續 例如 給出的陣列為 2,1,3,4,1,2,1,5,4 子陣列 2,1,3,4,1,2,1,5,4 具有最大的和 6.拓展 如果你已經提出了o n 的解決方法,請嘗試使用分治演算法來解決這道題。這道題...

53 執行緒池

一般在web服務端使用執行緒池是比較常見的,本節呢,就已以實現乙個簡單的web服務端為目標,僅僅實現get請求,最多在加上post請求.如果對web服務端並不熟悉的,可以回過頭去看一下http請求與應答以及乙個500行左右的web服務端原始碼tinyhttpd 整理了原始碼以及修改和加注釋後的lin...