力扣1235(java)-规划兼职工作(困难)
题目:
你打算利用空闲时间来做兼职工作赚些零花钱。
这里有 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)-规划兼职工作(困难)的更多相关文章
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- HTTPS那些事 用java实现HTTPS工作原理
HTTPS那些事 用java实现HTTPS工作原理 博客分类: java历险 今天被问到关于https原理的问题,结果由于知识掌握不牢靠,停留于表面,很多细节都无法回答清楚,于是决定把https的 ...
- 力扣—Remove Nth Node From End of List(删除链表的倒数第N个节点) python实现
题目描述: 中文: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二 ...
- 【力扣leetcode】-787. K站中转内最便宜的航班
题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...
- 零基础,三个月内,找到??? java后端开发工作
一.分析你的问题 出于尊重,先分析一下你的原问题吧,从您的问题,我提取到关键信息:"零基础"."三个月内"."找到工作",最后一个关键词&q ...
- 详解Java GC的工作原理+Minor GC、FullGC
详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...
- java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互
java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...
- Java Web程序工作原理
Web开发的最重要的基本功能是HTTP:Java Web开发的最重要的基本功是Servlet Specification.HTTP和Servlet Specitication对于Web Server和 ...
- 采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址
采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址. Truelicense 它是一个开源java license ...
- java体系结构与工作方式 《深入分析java web 技术内幕》第七章
java体系结构与工作方式 7.1 JVM体系结构 何谓JVM JVM(Java Virtual Machine) 通过模拟一个计算机来达到一个计算机所具有的计算功能 指令集:计算机所能识别的机器语言 ...
随机推荐
- 【mac】Alfred 无法调用Terminal
原因:是从mac app商店安装的Alfred class 解决方案:建议从官网下载安装:https://www.alfredapp.com/ 参考:https://www.alfredforum.c ...
- 逆向通达信Level-2 续三 (KTL python控制台动态调试)
python控制台逆向分析. python 跟 js 自如切换 逆向通达信Level-2 续十一 (无帐号登陆itrend研究版) 逆向通达信Level-2 续十 (trace脱壳) 逆向通达信Lev ...
- [剑指 Offer II 114. 外星文字典] 拓扑排序
import java.util.*; class Solution { public static void main(String[] args) { Solution solution = ne ...
- 使用Servlet实现文件下载
一位朋友最近在学习JavaWeb开发,开始学习文件下载操作,他自己尝试着去网上看一些教程,总的来说也不是太了解,就让我和他说说,如何实现文件下载功能.我和他说了一下大致的思路,主要分为前端和后端两部分 ...
- 不要升级!不要升级!MacOS 14.4 引发Java 应用崩溃
如果最近您收到了MacOS 14.4的升级提醒,那么建议你暂时先不要升级! 在x上,Java开发领域的一些大v们,也发现了这个问题,并提醒大家不要升级. 根据Java官方发布的文章了解到,该问题主要是 ...
- axios中设置了response:blol后,如何处理json对象
axios中文件下载 上传文件后台校验,若失败则下载文件 let loading = this.$common.loading("正在上传"); let form = new Fo ...
- FPGA中与时序有关的概念
FPGA中与时序有关的概念 一.时序分析 时序分析是对整个时序进行分析的操作.作用就是了解设计的时序性能,一般而言就是最大时钟频率.时钟频率越高,设计的工作速度越快(忽略设计实现方法的不同导致的效率提 ...
- C++ 通用锁管理
lock_guard 类 lock_guard 是互斥体包装器,为在作用域块期间占有互斥提供便利 RAII 风格机制. 创建 lock_guard 对象时,它试图接收给定互斥的所有权.控制离开创建 l ...
- [Android开发学iOS系列] iOS项目环境搭建和依赖管理
iOS项目环境搭建和依赖管理 一个项目总是会依赖一些库, 有些是第三方的, 有些可能是项目自身为了复用拆出去的. 现有主流的iOS依赖有多种形式, 比如CocoaPods, Carthage和swif ...
- 7 HTML锚点应用
7 锚点应用 锚点( anchor )是超链接的一种应用,也叫命名锚记,锚点可以像一个定位器一样,可以实现页面内的链接跳转,运用相当普遍.例如,我们有一个网页,由于内容太多,导致页面很长,而且里面的内 ...