dp+二分查找leetcode.1235

public int jobScheduling(int[] startTime, int[] endTime, int[] profit) {
        int n = startTime.length;
        int[][] jobs = new int[n][3];
        for (int i = 0; i < n; i++) {
            jobs[i] = new int[]{startTime[i], endTime[i], profit[i]};
        }
        Arrays.sort(jobs, (a, b) -> a[1] - b[1]);//按结束时间排序
        int[] dp = new int[n + 1];//考虑前i个工作的最大报酬
        dp[0]=0;//不考虑工作
        for (int i = 1; i <= n; i++) {
            int k = minGreater(jobs, i-1, jobs[i - 1][0]);//在前i-1个工作中寻找结束时间不大于当前工作开始时间的最大值
            dp[i] = Math.max(dp[i - 1], dp[k+1] + jobs[i - 1][2]);//不考虑当前工作或考虑当前工作
        }
        return dp[n];
    }

    public int minGreater(int[][] arr,int r,int tar){
        int l=-1;//左边界为-1,表示找不到
        //l与r相邻时,l指向<=tar的最大值,r指向>tar的最小值
        while(l+1<r){
            int mid=(l+r)>>1;
            if(arr[mid][1]<=tar)
                l=mid;//如果mid<=tar,则mid可能为<tar的最大值,或者=tar
            else
                r=mid;//如果mid>tar,则mid可能为>tar的最小值
        }
        return l;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值