最大子序和053 力扣(多種解法 c)

2021-10-11 09:23:25 字數 2785 閱讀 1148

給定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 解析 求最大子序和,最...