資料結構與演算法 分金條的最小花費

2021-09-29 13:20:05 字數 1931 閱讀 3632

題目描述

給定乙個正數陣列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...

資料結構與演算法 演算法 演算法和資料結構

資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...