【左神算法】IPO問題

502. IPO

  1. IPO

難度困難39

假設 力扣(LeetCode)即將開始其 IPO。爲了以更高的價格將股票賣給風險投資公司,力扣 希望在 IPO
之前開展一些項目以增加其資本。 由於資源有限,它只能在 IPO 之前完成最多 k 個不同的項目。幫助 力扣 設計完成最多 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。

優先隊列

實現思路

定義一個節點 p爲利潤 c爲成本。實現兩個比較器,最小成本比較器。最大利潤比較器。

首先定義node數組,將成本和利潤存儲到數組中。遍歷將成本存儲到小頂堆中。

每次從小頂堆中拿到最小的成本。

遍歷k,因爲最多k次交易,當小頂堆中不爲null並且當前的小頂堆元素小於等於當前以有成本,就進行交易。

大頂堆中存儲當前交易的最大利潤訂單。w+=最大訂單利潤。

終止結束條件,當大頂堆爲null 或者 交易次數達到k次,結束。

	private static class Node{
       int p;//利潤
       int c;//成本

       public Node(int p,int c){
           this.p = p;
           this.c = c;
       }
   }

   //最小的成本
   public class MinP implements Comparator<Node>{

       @Override
       public int compare(Node o1, Node o2) {
           return o1.c - o2.c;
       }
   }

   //最大的利潤
   public class MaxC implements Comparator<Node>{
       @Override
       public int compare(Node o1, Node o2) {
           return o2.p - o1.p;
       }
   }

    public int findMaximizedCapital(int k, int W, int[] Profits, int[] Capital) {
        Node [] nodes  = new Node[Profits.length];
        for (int i = 0; i < nodes.length; i++) {
            nodes[i] = new Node(Profits[i],Capital[i]);
        }

        PriorityQueue<Node> minPQ = new PriorityQueue<>(new MinP());
        PriorityQueue<Node> maxPQ = new PriorityQueue<>(new MaxC());

        for (int i = 0; i < nodes.length; i++) {
            minPQ.add(nodes[i]);
        }
        for (int i = 0; i < k; i++) {
            while (!minPQ.isEmpty() || minPQ.peek().c <= W) {
                maxPQ.add(minPQ.poll());
            }
            if (maxPQ.isEmpty()) {
                return W;
            }
            W+=maxPQ.poll().p;
        }
        return W;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章