当前位置: 首页 > news >正文

Leetcode 1235. 规划兼职工作

1.题目基本信息

1.1.题目描述

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

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

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

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

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

1.2.题目地址

https://leetcode.cn/problems/maximum-profit-in-job-scheduling/description/

2.解题方法

2.1.解题思路

动态规划+二分查找

2.2.解题步骤

第一步,状态定义;dp[i]为前i个兼职工作的最大报酬

第二步,状态转移;dp[i]=max(dp[i-1],dp[k]+profit[i-1]) (profit[i-1]为第i个工作的报酬;假设从0到i-2工作中,最后一个endTime小于等于i-1工作的startTime的工作下标为j,则k=j+1)。这里使用左闭右闭的未标记区间的方式进行二分

3.解题代码

Python代码

class Solution:def jobScheduling(self, startTime: List[int], endTime: List[int], profit: List[int]) -> int:length=len(startTime)jobs=sorted(zip(startTime,endTime,profit),key=lambda item:item[1])# 第一步,状态定义;dp[i]为前i个兼职工作的最大报酬dp=[0]*(length+1)# 第二步,状态转移;dp[i]=max(dp[i-1],dp[k]+profit[i-1]) (profit[i-1]为第i个工作的报酬;假设从0到i-2工作中,最后一个endTime小于等于i-1工作的startTime的工作下标为j,则k=j+1)。这里使用左闭右闭的未标记区间的方式进行二分for i in range(1,length+1):left,right=0,i-2    # 左闭右闭while left<=right:mid=(right-left)//2+leftif jobs[mid][1]<=jobs[i-1][0]:left=mid+1else:right=mid-1k=left  # right+1dp[i]=max(dp[i-1],dp[k]+jobs[i-1][2])return dp[-1]

C++代码

class Solution {
public:int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {int length=startTime.size();vector<vector<int>> jobs(length);for(int i=0;i<length;++i){jobs[i]={startTime[i],endTime[i],profit[i]};}sort(jobs.begin(),jobs.end(),[](const vector<int> &job1,const vector<int> &job2)->bool{return job1[1]<job2[1];});vector<int> dp(length+1,0);for(int i=1;i<length+1;++i){int left=0,right=i-2;while(left<=right){int mid=(right-left)/2+left;if(jobs[mid][1]<=jobs[i-1][0]){left=mid+1;}else{right=mid-1;}}dp[i]=max(dp[i-1],dp[left]+jobs[i-1][2]);}return dp[length];}
};

4.执行结果

在这里插入图片描述

http://www.lryc.cn/news/449922.html

相关文章:

  • LeetCode 2535.数组元素和与数字和的绝对差:模拟
  • SpringCloud-pom创建Eureka
  • 动态规划算法专题(一):斐波那契数列模型
  • H.264编解码工具 - x264
  • 外卖点餐小程序源码系统 单店多门店自助切换 带完整的安装代码包以及搭建部署教程
  • 通过Ideal和gitbash共同实现分支合并
  • Vue.js 组件开发
  • 【Lcode 随笔】C语言版看了不后悔系列持续更新中。。。
  • 排序--希尔排序
  • 【教程】57帧! Mac电脑流畅运行黑神话悟空
  • 『大模型笔记』Docker如何清理Build Cache!
  • 如何使用 Python 读取数据量庞大的 excel 文件
  • c语言200例 067
  • RabbitMQ的高级特性-死信队列
  • Python 复制PDF中的页面
  • Sql Developer日期显示格式设置
  • IP地址与智能家居能够碰撞出什么样的火花呢?
  • 人工智能技术在电磁场与微波技术专业的应用
  • The First项目报告:探索Yield Guild Games运行机制与发展潜力
  • 完成UI界面的绘制
  • iot网关是什么?iot网关在工业领域的应用-天拓四方
  • 从碎片到整合:EasyCVR平台如何重塑城市感知系统的视频数据生态
  • java socket bio 改造为 netty nio
  • 进程、线程、协程详解:并发编程的三大武器
  • 探索5 大 Node.js 功能
  • EZUIKit.js萤石云vue项目使用
  • 【Linux】磁盘分区挂载网络配置进程【更详细,带实操】
  • Java 为什么使用 UTF-16 而不是更节省内存的 UTF-8?
  • 损失函数篇 | YOLOv10 引入 Inner-IoU 基于辅助边框的IoU损失
  • 夹耳开放式耳机好用吗?一篇文章告诉你答案,附上挑选避坑小知识