輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為 o(n).
示例但是問題來了,暴力迴圈破解用了3個for迴圈,此時的時間複雜度為o(n^3) ,那有沒什麼方法可以優化呢?[1,-2,3,10,-4,7,2,-5]
18
輸入的陣列為,和最大的子陣列為,因此輸出為該子陣列的和 18。
這是我們可以考慮運用動態規劃的思想來繼續優化:
結合上述分析過程,綜合可理解轉移方程:
求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解法分析我記得這好像是一...