Leetcode 53 分治演算法求解最長子串和問題

2021-07-27 21:42:45 字數 844 閱讀 1605

問題描述:找到乙個陣列的最長連續子串和問題。

例如:input:[-2,1,-3,4,-1,2,1,-5,4]  output:[4,-1,2,1] maxsum=6;

問題思考: 

思路1:暴力求解  

for(int i=0;isum?max:sum;}

}

該演算法簡單易懂,但是往往時間消耗比較大

思路2:分治演算法

divide:將串平均分為兩段,如下**第6行。分別處理兩個子串,並拼接計算。

conquer: 計算1.自身包含左端的最大子串;2.包含右端的最大子串;(這兩個子串用於與其他子串拼接);3.自身的最大子串。

class solution 

int leftsum=maxsubsum(a,left,(left+right)/2);

int rightsum=maxsubsum(a,1+(left+right)/2,right);

int s1,sum1=0,sum2=0,s2,n=right-left+1;

s1=a[left+n/2-1];

s2=a[left+n/2];

for(int i=left+n/2-1;i>=left;i--)

for(int i=left+n/2;i<=right;i++)

sum=s1+s2;

sum=sum>leftsum?sum:leftsum;

sum=sum>rightsum?sum:rightsum;

return sum;

}int maxsubarray(vector& nums)

};

常用演算法3 分治法 Leetcode

所謂分治就是把整個問題分成無關緊要的小問題 執行步驟 劃分問題 整個問題劃分成多個無關聯的子問題。遞迴求解 遞迴呼叫求解各個子問題。合併問題 合併子問題的解,形成原始問題的解 給定乙個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣...

演算法02 分治

分治,就是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。分治法常常跟遞迴一起使用,借助遞迴,我們可以方便地將問題分解再將結果合併。分解 將原問題分解為若干個規模較小,相互獨立,與原問題形式相同的子問題 遞迴 若子問...

分治法 最大子序和(Leetcode 53)

找到公式 dp i max dp i 1 nums i nums i 其中dp i 表示以nums i 結尾的最大連續和。這個公式就理解成 對於當前這個數字,要麼前面的對你有益,你加上 要麼前面對你無益,你不需要前面的。所以,最後再額外使用乙個空間,用來保留目前為止認為的最大值即可。分治法,問題劃分...