力扣5 (自看

家人们 遇到b题了 经典思路不对超时加倍

上题:

假设 力扣(LeetCode)即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多 k 个不同项目后得到最大总资本的方式。

给你 n 个项目。对于每个项目 i ,它都有一个纯利润 profits[i] ,和启动该项目需要的最小资本 capital[i] 。

最初,你的资本为 w 。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。

总而言之,从给定项目中选择 最多 k 个不同项目的列表,以 最大化最终资本 ,并输出最终可获得的最多资本。

答案保证在 32 位有符号整数范围内。

用贪心思想进行暴力编写 长这样:

class Solution {
    public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
        //k为执行次数,w为当前可用预算,pro为获得的资本净赚(会把投资赚回),cap为需要的资本门槛
        int plannum = profits.length;    //总数
        int turnchoose=0 ;   //当前轮次所选择的计划下标
        int turnchooseprofit=0;  //当前选择的最大利益
        for(int i=0 ; i<k && i<plannum ; i++){   //决策执行块
            turnchooseprofit=0;
            for(int j=0 ; j<plannum ; j++){  //找出所有当前能执行的 并动态选择最优
                if(capital[j]<=w && profits[j]!=0){
                    if(profits[j]>turnchooseprofit){
                        turnchooseprofit=profits[j];
                        turnchoose=j;
                    }
                }
            }
            w+=turnchooseprofit;   //完成选择的计划
            profits[turnchoose]=0; //标记为完成的计划
        }
        return w;
    }
}

以为很轻松结束了,然后测试用例直接阴险的给我一刀,力扣5 (自看

 没辙了 重来,思路优化很重要, 既然他想要最佳 一定是选择profit-capital足够高的,也就是说先进行一次针对profit-capital的排序 这样就可以在每次遍历出 从数组靠上步选出最佳方案,进行执行 后面的又臭又长的方案根本看不到,也就不用担心时间的溢出问题了 ,优化后的代码:

一种植物 并没有整出来,用排序也会超时,只有排序+大根堆才能完美解决,看一下标答吧..

class Solution {
    public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
        int n = profits.length;
        int curr = 0;
        int[][] arr = new int[n][2];

        for (int i = 0; i < n; ++i) {
            arr[i][0] = capital[i];
            arr[i][1] = profits[i];
        }
        Arrays.sort(arr, (a, b) -> a[0] - b[0]);

        PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> y - x);
        for (int i = 0; i < k; ++i) {
            while (curr < n && arr[curr][0] <= w) {
                pq.add(arr[curr][1]);
                curr++;
            }
            if (!pq.isEmpty()) {
                w += pq.poll();
            } else {
                break;
            }
        }

        return w;
    }
}

大根堆可以极大的减少时间复杂度,很快速的查找出最优的方法,

大根堆会在大整理里重新学习一下,明天加油吧..

上一篇:老乡鸡冲击上市,拢共要几步?


下一篇:卫龙辣条IPO招股书失效:刘卫平、刘福平控股,销售渠道依赖线下