給定n個整數的序列a1,
a2,…
,ana1
,a2
,…,
an,求函式f(i
,j)=
maxf(i,j) = max \^ja_k\}
f(i,j)
=max
的最大值。
命名規範問題:關於c語言的命名規範問題,對於c語言,一般而言變數命名採用駝峰規則,若變數採用多個單詞拼成,首單詞首字母小寫,其餘單詞的首字母大寫。對於函式,為了區分庫函式與自己定義的函式,故自己定義的函式一般採用首字母大寫。巨集定義裡面的變數全大寫。
int
maxubseqsum1
(int
*a,int n)
}return maxsum;
}
該演算法的時間複雜度為o(n
3)o(n^3)
o(n3).
對於上述暴力求解,可以發現,第三層迴圈求子列和的時候,都是從i處開始計算到j處的子列和,接下來是從i處計算到j+1處,實際上我們不必每次從i開始,而從上一次得到的結果往後加一項就行,所以第三層迴圈沒必要。
int
maxsubseqsum2
(int
*a,int n)
}return maxsum;
}
該演算法的時間複雜度:o(n
2)o(n^2)
o(n2
)對於時間複雜度為o(n
2)o(n^2)
o(n2
)的演算法,我們希望對其加以改進使其複雜度達到o(n
logn
)o(nlogn)
o(nlog
n)
分而治之也就是分治法,什麼是分支法?如果我們有乙個很複雜的大問題,很難直接解決它,但是我們發現可以把問題劃分成子問題,如果子問題規模還是太大,並且它還可以繼續劃分,那就繼續劃分下去。直到這些子問題的規模已經很容易解決了,那麼就把所有的子問題都解決,最後把所有的子問題合併,我們就得到複雜大問題的答案了。對於該問題,我們可以將整個序列一分為二,遞迴的去解決左右兩邊的問題,分別求左半部分的最大子列和,右半部分的最大子列和。然後再去求橫跨左右兩部分的最大子列和,那麼整體的最大子列和一定在三者之中產生。也就是三個子問題都能解決,那麼答案就是三個結果的最大值。所以這就是先分,後治。
如下圖所示:
分析演算法複雜度,t(n
)=2t
(n/2
)+cn
t(n) = 2t(n/2) + cn
t(n)=2
t(n/
2)+c
n,因為一分為2,解決每半部分的時間複雜度為t(n/2),因為規模減半了,而計算橫跨左右兩半部分的最大子列和時掃瞄一次整個序列,故其複雜度為o(n).
因此其遞推公式為:
t (n
)=2t
(n/2
)+cn
t(n) = 2t(n/2) + cn
t(n)=2
t(n/
2)+c
n= 2[2
t(n/
22)+
cn/2
]+cn
2[2t(n/2^2)+cn/2]+cn
2[2t(n
/22)
+cn/
2]+c
n 當n/2^k = 1時,此時有t(1)=o(1)
= 2 ko
(1)+
ckn2^ko(1)+ckn
2ko(1)
+ckn
把n/2^k = 1代入
=o (n
logn
)o(nlogn)
o(nlog
n)因此其時間複雜度為o(n
logn
)o(nlogn)
o(nlog
n)
int
max(
int a,
int b,
int c)
intmaxsubseq
(int
*a,int left,
int right)
int maxrightbordersum = a[center +1]
;int rightbordersum =0;
for(
int i = center +
1; i <= right; i++
)return
max(leftsum, rightsum, maxleftbordersum+maxrightbordersum);}
intmaxsubseqsum3
(int
*a,int n)
另外需要注意的是,程式設計過程中判斷相等的時候,可以將常數放在前面,防止由於書寫錯誤而引起的錯誤,比如1=len,書寫的時候少寫了乙個等號,而len=1就認為是賦值操作,沒有問題,但是1=len就會報錯了。
int
maxsubseqsum4
(int
*a,int n)
return maxsum;
}
力扣 53 最大子序和
題目描述 簡單 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。題目鏈結 示例 1 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。演算法分析 設dp i 表示以第i個數結尾的子陣列的最大和,那麼只...
力扣53 最大子序和
給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。法一 利用二級指標申請乙個二維陣列 a int malloc sizeof int m fo...
力扣題解 最大子序和
題目 給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。int n nums.length int msa newint n msa 0 nums 0 int max msa 0 for int j 1 j return max 解析 求最大子序和,最...