题目:

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

这里有 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

动态规划+二分查找:

1.首先将兼职工作按结束时间从小到大进行排序;

2.dp[i]:表示第 i 份工作可以获得的最大报酬,初始化dp[0] = 0;

3.则最大报酬可以分情况讨论:

  • 如果不选择第 i 份工作:则dp[i] = dp[i-1];
  • 如果选择第 i 份工作:那么此时的结果就是当前工作的收获+小于当前工作开始时间的最大结束时间,此时又可以使用二分查找来解决小于某一个数最大的位置。所以:dp[i] = dp[j] + profit[i];
  • 两者取最大值:dp[i] = max(dp[i-1],dp[j] + profit[i])

java代码:

 1 class Solution {
2 public int jobScheduling(int[] startTime, int[] endTime, int[] profit) {
3 int n = startTime.length;
4 int[] dp = new int[n+1];
5 int[][] jobs = new int[n][3];
6 for(int i = 0; i < n; i++){
7 jobs[i] = new int[]{startTime[i], endTime[i], profit[i]};
8 }
9 //按照结束时间从小到大排序
10 Arrays.sort(jobs, (a,b)->a[1]-b[1]);
11 for(int i = 0; i < n; i++){
12 int max = binarySearch(jobs, i, jobs[i][0]);
13 dp[i+1] = Math.max(dp[i], dp[max] + jobs[i][2]);
14 }
15 return dp[n];
16
17 }
18 //使用二分查找,找到小于下一个开始时间的最大结束时间
19 //right:当前位置, target:当前位置的开始时间
20 public int binarySearch(int[][] jobs, int right, int target){
21 int left = 0;
22 while(left < right){
23 int mid = (left + right) / 2;
24 if(jobs[mid][1] <= target){
25 left = mid + 1;
26 }else{
27 right = mid;
28 }
29 }
30 return left;
31 }
32 }

力扣1235(java)-规划兼职工作(困难)的更多相关文章

  1. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  2. HTTPS那些事 用java实现HTTPS工作原理

    HTTPS那些事 用java实现HTTPS工作原理 博客分类: java历险   今天被问到关于https原理的问题,结果由于知识掌握不牢靠,停留于表面,很多细节都无法回答清楚,于是决定把https的 ...

  3. 力扣—Remove Nth Node From End of List(删除链表的倒数第N个节点) python实现

    题目描述: 中文: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二 ...

  4. 【力扣leetcode】-787. K站中转内最便宜的航班

    题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...

  5. 零基础,三个月内,找到??? java后端开发工作

    一.分析你的问题 出于尊重,先分析一下你的原问题吧,从您的问题,我提取到关键信息:"零基础"."三个月内"."找到工作",最后一个关键词&q ...

  6. 详解Java GC的工作原理+Minor GC、FullGC

    详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...

  7. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

    java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...

  8. Java Web程序工作原理

    Web开发的最重要的基本功能是HTTP:Java Web开发的最重要的基本功是Servlet Specification.HTTP和Servlet Specitication对于Web Server和 ...

  9. 采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址

    采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址. Truelicense 它是一个开源java license ...

  10. java体系结构与工作方式 《深入分析java web 技术内幕》第七章

    java体系结构与工作方式 7.1 JVM体系结构 何谓JVM JVM(Java Virtual Machine) 通过模拟一个计算机来达到一个计算机所具有的计算功能 指令集:计算机所能识别的机器语言 ...

随机推荐

  1. 日常办公——Excel中重复打印标题的设置

    打印预览时,所在数据行或列不能显示在同一页,在打印区域之外还有内容,为了方便阅读,可使用顶端标题行重复或左端标题行重复,具体方法如下: 按顺序操作,完成后点击确定即完成操作.

  2. STM32 USB协议和代码分析

    一 前言: usb接口是一个非常重要的通信接口,它的协议是有些复杂的.作为一个工程师,对usb协议和代码进行分析,是一个必备的素质和技能.最近一个项目用到了USB存储接口,花了不少时间把项目做完之后, ...

  3. eclipse错误之Unhandled event loop exception PermGen space

    原来一直用eclipse3.5,最近尝试升级到3.7和4.2,但不管是3.7还是4.2项目编译过程中总提示"Unhandled event loop exception PermGen sp ...

  4. 03.Android崩溃Crash库之ExceptionHandler分析

    目录总结 00.异常处理几个常用api 01.UncaughtExceptionHandler 02.Java线程处理异常分析 03.Android中线程处理异常分析 04.为何使用setDefaul ...

  5. Cesium渲染模块之Texture

    1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...

  6. k8s-master 设置调度污点

    k8s master 调度污点 NoSchedule:K8Snode添加这个effecf类型污点,新的不能容忍的pod不能再调度过来,但是老的运行在node上不受影响 NoExecute:K8Snod ...

  7. C#词云生成器

    GitHub - sdcb/Sdcb.WordCloud: Generate WordCloud image from .NET/.NET Core 效果 根据mask生成

  8. JS实现打开报表时默认为最后一次查询参数

    问题描述 普通报表在打开时希望参数面板中的参数控件的值可以默认是上一次页面关闭前最后一次查询所选择的值. 解决方案 每次在页面关闭时将参数值保存到浏览器缓存中(适用用非FS平台),或每次点击查询后将参 ...

  9. 链表队列(LinkedListQueue)

    栈操作 入队 template<typename T> void LinkedListQueue<T>::enqueue(T e) { if (tail == nullptr) ...

  10. C#数据去重的5种方式,你知道几种?

    前言 今天我们一起来讨论一下关于C#数据去重的的5种方式,每种方法都有其特点和适用场景,我们根据具体需求选择最合适的方式.当然欢迎你在评论区留下你觉得更好的C#数据去重的方式. 使用HashSet去重 ...