首先確定思路,在擁有 w 的資本時,我們能選擇的項目 i 必須滿足 capital[i]≤w,而為使獲得的利潤最高,以及下一次選擇項目時,資本最大,我們應選擇在這些符合條件的項目中,利潤最大的項目。
因此我們可以將所有項目按照 capital 進行 排序(Sorting) ,然後遍歷這些項目,將可以進行的項目放入一個 最大堆積(Max Heap) 中,Max Heap中存放的是這些項目的利潤。我們每次從中取出利潤最大的項目執行,然後更新公司的資本。我們重複這個過程 k 次,直到達到最大化資本或者無法再執行項目為止。
複雜度分析
時間複雜度:O(nlogn+klogn) ,其中 n 是項目的數量。
對所有項目按照資本進行排序需要 O(nlogn) 的時間。
對於每個項目最多需要進行一次 heappush 操作,每次操作的時間複雜度為 O(logn) ,最多執行 n 次,因此需要 O(nlogn) 的時間。
對於每個項目最多需要進行一次 heappop 操作,每次操作的時間複雜度為 O(logn) ,最多執行 k 次,因此需要 O(klogn) 的時間。
空間複雜度:O(n) ,需要一個大小為 n 的陣列來存儲所有項目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution: deffindMaximizedCapital(self, k: int, w: int, profits: List[int], capital: List[int]) -> int: n = len(profits) projects = [(c, p) for c, p inzip(capital, profits)] projects.sort() # Sort the projects by capital in ascending order
ans, idx = w, 0 hp = [] # Max heap for _ inrange(k): while idx < n and projects[idx][0] <= ans: # Add all the projects that can be done now heappush(hp, -projects[idx][1]) # Max heap idx += 1 ifnot hp: # No project can be done break ans += -heappop(hp) # Do the project with the maximum profit return ans
classSolution { public: intfindMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital){ int n = profits.size(); vector<pair<int, int>> projects; for (int i = 0; i < n; i++) projects.push_back({capital[i], profits[i]}); // Sort the projects by capital in ascending order sort(projects.begin(), projects.end());
int ans = w, idx = 0; priority_queue<int> hp; // Max heap for (int i = 0; i < k; i++) { // Add all the projects that can be done now while (idx < n && projects[idx].first <= ans) hp.push(projects[idx++].second); // No project can be done if (hp.empty()) break; // Do the project with the maximum profit ans += hp.top(); hp.pop(); } return ans; } };
寫在最後
Cover photo is generated by @たろたろ, thanks for their work!