問題描述:找到乙個陣列的最長連續子串和問題。
例如: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 結尾的最大連續和。這個公式就理解成 對於當前這個數字,要麼前面的對你有益,你加上 要麼前面對你無益,你不需要前面的。所以,最後再額外使用乙個空間,用來保留目前為止認為的最大值即可。分治法,問題劃分...