劍指offer打卡Day 08 連續子陣列的最大和

2021-10-14 09:47:55 字數 1603 閱讀 5129

輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為 o(n).

示例

[1,-2,3,10,-4,7,2,-5]
18
輸入的陣列為,和最大的子陣列為,因此輸出為該子陣列的和 18。
但是問題來了,暴力迴圈破解用了3個for迴圈,此時的時間複雜度為o(n^3) ,那有沒什麼方法可以優化呢?

這是我們可以考慮運用動態規劃的思想來繼續優化:

結合上述分析過程,綜合可理解轉移方程:

求dp[i]的時存在兩種可能:

public

intfindgreatestsumofsubarray

(int

array)

;//從陣列首位元素開始

int max = array[0]

;//暫存最大值

int res = array[0]

;for

(int i =

1; i < array.length; i++

)return res;

}

執行速度比較:

動態規劃

@test

public

void

test1_withdp()

;long starttime=system.

currenttimemillis()

;//獲取開始時間

for(

int i =

0; i <

10000000

; i++

)long endtime=system.

currenttimemillis()

;//獲取結束時間

system.out.

println(+

(endtime-starttime)

+"ms");

}

暴力求解

@test

public

void

test1_withviolence()

;long starttime=system.

currenttimemillis()

;//獲取開始時間

for(

int i =

0; i <

10000000

; i++

)long endtime=system.

currenttimemillis()

;//獲取結束時間

system.out.

println(+

(endtime-starttime)

+"ms");

}

動態規劃擴充套件閱讀:

動態規劃(一)一一狀態定義和狀態轉移方程

連續子陣列最大和

什麼是動態規劃?動態規劃的意義是什麼?

2020 12 10 劍指offer打卡

題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。解題思路 1.雜湊表 統計每個數出現的次數 時間複雜度o n 空間複雜度o n 2.排序法 先將陣列排序,可能的眾數肯定...

劍指offer 08 跳台階

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 於本題,前提只有 一次 1階或者2階的跳法。a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 b.假定第一次跳的是2階,那麼剩下的是...

劍指offer 08 跳台階

題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 時間限制 c c 3秒,其他語言6秒 空間限制 c c 64m,其他語言128m 題目示例 示例1 輸入 1 返回值 1 示例2 輸入 4 返回值 5解法分析我記得這好像是一...