題目描述
給定乙個正數陣列arr,arr的累加和代表金條的總長度,arr的每個數代表金條要分成的長度。規定長度為k的金條分成兩塊,費用為k個銅板。返回把金條分出arr中的每個數字需要的最小代價。思路[要求]
時間複雜度為o(n \log n)o(nlogn),空間複雜度為o(n)o(n)
直接使用貪心策略,這個為什麼對,我們不需要自己去證明,只需要我們的策略是具有傳遞性的,那麼怎麼測試我們的方法是否正確呢?,很簡單,自己實現乙個比較器,採用暴力解法,就是絕對正確的方法,然後用小資料集測試,看我們的方法與比較器的方法是否相同。
/**
* 給定乙個正數陣列arr,arr的累加和代表金條的總長度,arr的每個數代表金條要分成的長度。
* 規定長度為k的金條分成兩塊,費用為k個銅板。返回把金條分出arr中的每個數字需要的最小代價。
* @author zhx
*/public
class
less_money
//花費的最小代價
int sum =0;
//臨時儲存一下兩個最小的數的和
int cur =0;
while
(pq.
size()
>1)
return sum;
}public
static
class
minheapcomparator
implements
comparator
}public
static
class
maxheapcomparator
implements
comparator
}public
static
void
main
(string[
] args)
; system.out.
println
(lessmoney
(arr));
int[
] arrforheap =
; priorityqueue
minq1 =
newpriorityqueue
<
>()
;for
(int i =
0; i < arrforheap.length; i++
)while
(!minq1.
isempty()
) system.out.
println()
; priorityqueue
minq2 =
newpriorityqueue
<
>
(new
minheapcomparator()
);for(
int i =
0; i < arrforheap.length; i++
)while
(!minq2.
isempty()
) system.out.
println()
; priorityqueue
minq3 =
newpriorityqueue
<
>
(new
maxheapcomparator()
);for(
int i =
0; i < arrforheap.length; i++
)while
(!minq3.
isempty()
) system.out.
println()
;}}
分金條的最小花費
一塊金條切成兩半,是需要花費和長度數值一樣的銅板的。比如 長度為20的 金條,不管切成長度多大的兩半,都要花費20個銅 板。一群人想整分整塊金 條,怎麼分最省銅板?例如,給定陣列,代表一共三個人,整塊金條長度為 10 20 30 60.金條要分成10,20,30三個部分。如果,先把長 度60的金條分...
資料結構與演算法 leetcode155最小棧
設計乙個支援 push pop top 操作,並能在常數時間內檢索到最小元素的棧。push x 將元素 x 推入棧中。pop 刪除棧頂的元素。top 獲取棧頂元素。getmin 檢索棧中的最小元素。示例 輸入 minstack push push push getmin pop top getmin...
資料結構與演算法 演算法 演算法和資料結構
資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...