LeetCode解題報告 502 IPO

2022-05-19 16:37:39 字數 2578 閱讀 8090

假設 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 ...