LeetCode 502. IPO

LeetCode Jun 16, 2024

2024.6.15 Daily Challenge

難度:Hard

問題

參數

k 可以做幾個 project

w 現在有多少 capital

profits, capital project 所需 capital 的 array

說明

你可以做 k 個 project,每個 project 最多只能做一次。

只有在滿足 current_capital > capital[i] 才能做 project i

做完一個 project 你的 capital 可以增加 profit[i]

請解出 max profit。

解法

一直很不想面對,隔天才寫出來。本來以為做完 project 會消耗 capital,但其實不會。

結論是維護一個 projectProfits 的 PriorityQueue,在 current_capital 增加時把 capital[i] < current_capital 的 project profit 都加進去,每次選最大的做就行。

import java.util.PriorityQueue

data class Project(
	val capital: Int,
	val profit: Int
)

class Solution502 {
	fun findMaximizedCapital(k: Int, w: Int, profits: IntArray, capital: IntArray): Int {
		val allProjects = PriorityQueue<Project>(compareBy { it.capital })
		profits.indices.forEach {
			allProjects.add(
				Project(capital[it], profits[it])
			)
		}

		val projectProfits = PriorityQueue<Int>(compareBy { -it })
		var ans = w

		for (i in 0 until k) {
			while (allProjects.isNotEmpty() && allProjects.peek().capital <= ans) {
				projectProfits.add(allProjects.poll().profit)
			}

			if (projectProfits.isEmpty()) {
				break
			}

			ans += projectProfits.poll()
		}

		return ans
    }
}

Tags