LeetCode每日一题系列

题目:1235. 规划兼职工作
难度:困难


文章目录

  • LeetCode每日一题系列
  • 题目
  • 示例
  • 思路
  • 题解

题目

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

这里有 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

思路

动态规划+二分搜索

  • dp数组定义为到某个截止时间所能获得的最大收入,初始值为[[0,0]]
  • 这里先将开始时间、结束时间、和对应的收入合成一个数组,并按照结束时间由小到大排序
  • 遍历排序后的数组,寻找每个开始时间之前的最后一个结束时间dp[i][0],判断该元素的价格加上上一个结束时间的dp[i]][1]是否大于dp[-1][1],如果大于则在dp上添加本元素的结束时间以及最大收入和,如果小于则跳过。

题解

class Solution:def jobScheduling(self, startTime: List[int], endTime: List[int], profit: List[int]) -> int:# 组合并排序jobs = sorted(zip(startTime, endTime, profit), key=lambda x: x[1])# dp数组dp = [[0, 0]]# 遍历for s, e, p in jobs:# 二分查找i = bisect.bisect(dp, [s + 1]) - 1# 判断是否需要更新结束时间和最大收入if dp[i][1] + p > dp[-1][1]:dp.append([e, dp[i][1] + p])return dp[-1][1]

LeetCode每日一题——1235. 规划兼职工作相关推荐

  1. LeetCode 1235. 规划兼职工作(动态规划+二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 你打算利用空闲时间来做兼职工作赚些零花钱. 这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 ...

  2. 【1235. 规划兼职工作】

    来源:力扣(LeetCode) 链接:   你打算利用空闲时间来做兼职工作赚些零花钱.   这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 ...

  3. LeetCode每日一题: 1723. 完成所有工作的最短时间

    1723. 完成所有工作的最短时间 题目 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工作都应该分配给工人,且每项工作 ...

  4. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  5. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  6. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  7. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用

    leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...

  8. 动态规划-规划兼职工作

    动态规划-规划兼职工作 一.问题描述 你打算利用空闲时间来做兼职工作赚些零花钱.这里有 n 份兼职工作,每份工作预计从 startTime 开始到 endTime 结束,报酬为 profit.给你一份 ...

  9. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色

    LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...

最新文章

  1. 庆祝博客积分成功上四位数!
  2. php 枚举cookie内容,php如何修改cookie内容?
  3. 从最小二乘到岭回归(Ridge Regression)的深刻理解
  4. swap(a,b)值交换的4种方法
  5. 红帽企业版linux 7.3,红帽推企业Linux 7.3 新功能特性一览
  6. java sql2008的增删改查_SQL server数据库增删改查练习
  7. MySQL分区表概述
  8. 米斯特白帽培训讲义 漏洞篇 SQL 注入
  9. Want To Say Something
  10. labview小波包分解
  11. 六大设计原则(SOLID)备忘
  12. wxpython使用多进程_最简单方法远程调试Python多进程子程序
  13. 【水】【SCOI】 精简题解
  14. 如何制作微信春节头像,分享手机、电脑端制作头像的方法
  15. (转)The Neural Network Zoo
  16. java xlsx转html
  17. Spring系列之依赖注入的三种方式
  18. c语言设计函数删除大写字母,C语言第七周作业
  19. 【BZOJ3407】[Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题【01背包】
  20. ubuntu18.04 64位+GTX1070max-q安装CUDA10.0+CUDNN7.4.2+安装Anaconda3.5.2+PyTorch1.4+torchvision0.5

热门文章

  1. 艾司博讯:拼多多揽件信息超时处罚是什么
  2. 电机的堵转检测及处理
  3. vue中使用echart地图
  4. 亚马逊店铺如何计算?
  5. PPT怎么转化成PDF?这两种方法教你快速解决!
  6. fatal error: FL/Fl_Gl_Window.H: No such file or directory的解决
  7. STM32F103的FLASH代码
  8. BZOJ3155: Preprefix sum【线段树】
  9. 华为比苹果更需要 AR 眼镜
  10. ISACA与南京审计大学合作一周年,“ISACA南审校园日”在宁举行