• 困难1235. 规划兼职工作


    这道题对算法要求很高,前两天之前提交过几次,老是超出了运算时间,今天终于做好了,思路也清晰
    解题思路:按照开始时间排序,之后开始循环。
        工作1到2,生成3中可能[1,2,12],不停的生成下个list
        对list过滤掉一些可能
        1、过滤掉结束时间小于当前t1的开始时间的序列,保留一个最大的值
        2、过滤掉同一份工作的,保留最大

    你打算利用空闲时间来做兼职工作赚些零花钱。

    这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 profit[i]。

    给你一份兼职工作表,包含开始时间 startTime,结束时间 endTime 和预计报酬 profit 三个数组,请你计算并返回可以获得的最大报酬。

    注意,时间上出现重叠的 2 份工作不能同时进行。

    如果你选择的工作在时间 X 结束,那么你可以立刻进行在时间 X 开始的下一份工作。

    示例 1:

    输入:startTime = [1,2,3,3], endTime = [3,4,5,6], profit = [50,10,40,70]
    输出:120
    解释:
    我们选出第 1 份和第 4 份工作,
    时间范围是 [1-3]+[3-6],共获得报酬 120 = 50 + 70。
    示例 2:

    输入:startTime = [1,2,3,4,6], endTime = [3,5,10,6,9], profit = [20,20,100,70,60]
    输出:150
    解释:
    我们选择第 1,4,5 份工作。
    共获得报酬 150 = 20 + 70 + 60。
    示例 3:

    输入:startTime = [1,1,1], endTime = [2,3,4], profit = [5,6,4]
    输出:6
     

    提示:

    1 <= startTime.length == endTime.length == profit.length <= 5 * 10^4
    1 <= startTime[i] < endTime[i] <= 10^9
    1 <= profit[i] <= 10^4

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/maximum-profit-in-job-scheduling
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    /**
     * @param {number[]} startTime
     * @param {number[]} endTime
     * @param {number[]} profit
     * @return {number}
     */
    var jobScheduling = function(startTime, endTime, profit) {
        //按照开始时间排序,之后开始循环。
        //工作1到2,生成3中可能[1,2,12],不停的生成下个list
        //对list过滤掉一些可能
        //1、过滤掉结束时间小于当前t1的开始时间的序列,保留一个最大的值
        //2、过滤掉同一份工作的,保留最大
        const startArr=[]
        for(let i=0;i<startTime.length;i++){
            startArr.push(i)
        }
        //开始时间排序
        startArr.sort(function(p1,p2){
            return startTime[p1]-startTime[p2]
        })
        let preList=[]
        let prePriceList=[]
        for(let i=0;i<startArr.length;i++){
            
            const t1=''+startArr[i]
            const list=[t1]
            const priceList=[profit[t1]]
            let maxK=-1;
            preList.forEach(function(t0,k){
            
                //判断是否可以做下一个
                if(endTime[t0]<=startTime[t1]){
                    //过滤掉结束时间小于当前t1的开始时间的序列,保留一个最大的值
                    if(maxK===-1||prePriceList[k]>prePriceList[maxK]){
                        maxK=k
                    }
                    const n1=list.indexOf(t1)
                    if(n1===-1){
                        list.push(t1)
                        priceList.push(prePriceList[k]+profit[t1])
                    }else{
                        priceList[n1]=Math.max(prePriceList[k]+profit[t1],priceList[n1])
                    }
                }else{
                    list.push(t0)
                    priceList.push(prePriceList[k])
                }
            })
            
            if(maxK>-1){
                list.push(preList[maxK])
                priceList.push(prePriceList[maxK])
            }
            preList=list
            prePriceList=priceList
        }
        
        return Math.max.apply(Math,prePriceList)
    };
  • 相关阅读:
    Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API
    Java基础学习笔记十四 常用API之基本类型包装类
    Java基础学习笔记六 Java基础语法之类和ArrayList
    Java基础学习笔记七 Java基础语法之继承和抽象类
    Java基础学习笔记八 Java基础语法之接口和多态
    Java基础学习笔记九 Java基础语法之this和super
    Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类
    Java基础学习笔记三 Java基础语法
    ssrs 里 表头 分页后显示
    CentOS 部署RabbitMQ集群
  • 原文地址:https://www.cnblogs.com/caoke/p/16770285.html
Copyright © 2020-2023  润新知