假設 leetcode 即將開始其 ipo。為了以更高的**將**賣給風險投資公司,leetcode希望在 ipo 之前開展一些專案以增加其資本。 由於資源有限,它只能在 ipo 之前完成最多 k 個不同的專案。幫助 leetcode 設計完成最多 k 個不同專案後得到最大總資本的方式。
給定若干個專案。對於每個專案 i,它都有乙個純利潤 pi,並且需要最小的資本 ci 來啟動相應的專案。最初,你有 w 資本。當你完成乙個專案時,你將獲得純利潤,且利潤將被新增到你的總資本中。
總而言之,從給定專案中選擇最多 k 個不同專案的列表,以最大化最終資本,並輸出最終可獲得的最多資本。
示例 1:
輸入: k=2, w=0, profits=[1,2,3], capital=[0,1,1].
輸出: 4
解釋:由於你的初始資本為 0,你盡可以從 0 號專案開始。
在完成後,你將獲得 1 的利潤,你的總資本將變為 1。
此時你可以選擇開始 1 號或 2 號專案。
由於你最多可以選擇兩個專案,所以你需要完成 2 號專案以獲得最大的資本。
因此,輸出最後最大化的資本,為 0 + 1 + 3 = 4。
注意:假設所有輸入數字都是非負整數。
表示利潤和資本的陣列的長度不超過 50000。
答案保證在 32 位有符號整數範圍內。
這題我選擇用堆排序來做,具體流程如下:
目標:最大化當前持有的資本
將啟動資本
與獲利
打包在乙個節點中再進行排序.具體的排序為按照啟動資本
從小到大排序,如果相等的啟動資本
,則按照獲利
從大到小排序
迴圈遍歷打包排序好的陣列:將當前持有的資本
與目前遍歷到的節點所需的啟動資本
比較:
如果當前持有的資本
大於或等於節點所需的啟動資本
:將該節點能獲取的利潤
插入堆中,並將堆調整維護為乙個最大堆(這樣能保證堆頂始終存放著能以持有的資本
獲取的最大利潤
)
如果當前持有的資本
小於節點所需的啟動資本
,更不用說後面的那些節點了,停止遍歷,將堆頂存放的值加到當前持有的資本
中,並將堆頂刪除
當前持有的資本
已經發生變化,繼續在陣列從剛才的位置往後遍歷,直到選擇完給定的k個專案
邊界條件
如果一開始給定的當前持有的資本
比陣列中最前面的那個節點帶有的啟動資本都要小,也就是說以當前持有的資本
根本選擇不了任何乙個啟動專案,直接返回當前持有的資本
如果給定的可選k個專案比總的專案還要多,那麼k值要變成中的專案數。因為總共就這麼多,不可能選出比總數還多的專案來。
#include #include #include using namespace std;
// 將啟動資本與獲利打包在乙個節點上
struct node
;// 自定義的排序流程
bool cmp(const node &a, const node &b)
class solution
sort(pack, pack+len, cmp);
// 邊界條件,如果連最小的專案的啟動成本都比w要大,那一開始就沒有什麼專案可選
if (pack[0]._c > w)
return 0;
// 邊界條件,如果可選專案k的個數大於給定的專案個數,k應該重新賦值
if (k > len)
k = len;
int maxsum = w, i = 0;
vectormax_heap;
//開始演算法
while (k)
// 因為此時堆頂就是目前利潤最大的專案的利潤值,將堆頂元素加到maxsum上去,並刪除堆頂(與最後乙個互換,然後繼續調整最大堆)
maxsum += max_heap[0];
max_heap[0] = max_heap[max_heap.size()-1];
max_heap.pop_back();
percdown(max_heap);
k--;
}return maxsum;
}void percup(vector&max_heap)
max_heap[child] = x;
}void percdown(vector&max_heap)
max_heap[father] = x;
}};int main()
; vectorcapital = ;
int k = 10, w = 0;
solution s;
cout << "最大資本是:" << s.findmaximizedcapital(k, w, profit, capital) << endl;
return 0;
}
最後
這題直接使用stl中的優先佇列更方便,堆調整的演算法也更好。
leetcode 解題報告(21 28)
題目描述 合併兩個有序鍊錶 解題思路 水題 definition for singly linked list.class listnode object def init self,x self.val x self.next none class solution object defmerge...
Leetcode 33 解題報告
leetcode 33 解題報告 對於排序之後的資料結構,二分查詢是不二法則。本題的關鍵就在於如何針對旋轉之後的排序陣列進行二分查詢。考慮到陣列中沒有重複元素 注意這一前提十分關鍵 可以提供兩種思路 1 兩次二分查詢 第一次二分查詢的目標是找出陣列具體在哪個位置做了旋轉,這個可以簡單地通過比較num...
LeetCode50 Pow x, n 解題報告
題目的意思是實現乙個pow 函式。input 2.00000,10 output 1024.00000這裡用的是遞迴的辦法,能夠降低時間複雜度,不過需要對n進行奇數,偶數進行判斷,用了 0x1進行判斷,當判斷n為奇數的時候,乘上x。如下 class solution bool flag false ...