【leetcode】1235. Maximum Profit in Job Scheduling
题目如下:
We have
njobs, where every job is scheduled to be done fromstartTime[i]toendTime[i], obtaining a profit ofprofit[i].You're given the
startTime,endTimeandprofitarrays, you need to output the maximum profit you can take such that there are no 2 jobs in the subset with overlapping time range.If you choose a job that ends at time
Xyou will be able to start another job that starts at timeX.Example 1:
Input: startTime = [1,2,3,3], endTime = [3,4,5,6], profit = [50,10,40,70]
Output: 120
Explanation: The subset chosen is the first and fourth job.
Time range [1-3]+[3-6] , we get profit of 120 = 50 + 70.Example 2:
Input: startTime = [1,2,3,4,6], endTime = [3,5,10,6,9], profit = [20,20,100,70,60]
Output: 150
Explanation: The subset chosen is the first, fourth and fifth job.
Profit obtained 150 = 20 + 70 + 60.Example 3:
Input: startTime = [1,1,1], endTime = [2,3,4], profit = [5,6,4]
Output: 6Constraints:
1 <= startTime.length == endTime.length == profit.length <= 5 * 10^41 <= startTime[i] < endTime[i] <= 10^91 <= profit[i] <= 10^4
解题思路:很容易看出应该用动态规划。假设dp[i]为第i个工作在所有选择的工作序列中排在最后一个时可以获得的最大利润,那么有dp[i] = max(dp[i],dp[j] + profit[i] )(i.startTime >= j.endTime)。但是这样时间复杂度是O(n^2),这无法被接受。继续寻找规律,对于dp[i]来说,我们要找的是所有endTime小于i.startTime的元素,所有我们可以按endTime升序排序,存储每个endTime可以获得的利润的最大值到一个列表中,这样的话,对于startTime来说,只要通过二分查找找到在endTime在列表中的位置,即可求得对应的最大值。
代码如下:
class Solution(object):
def jobScheduling(self, startTime, endTime, profit):
"""
:type startTime: List[int]
:type endTime: List[int]
:type profit: List[int]
:rtype: int
"""
import bisect
item_list = []
for (start,end,pro) in zip(startTime,endTime,profit):
item_list.append((start,end,pro))
def cmpf(v1,v2):
if v1[1] != v2[1]:return v1[1] - v2[1]
return v1[0] - v2[0]
item_list.sort(cmp=cmpf)
dp = [0] * len(item_list)
dp[0] = item_list[0][2] end_time_order = []
for i in range(len(item_list)):
end_time_order.append(item_list[i][1]) max_val_list = [dp[0]]
max_val = dp[0]
for i in range(1,len(item_list)):
dp[i] = item_list[i][2] start = item_list[i][0] #left = bisect.bisect_left(end_time_order,start)
right = bisect.bisect_right(end_time_order,start)
if right == len(max_val_list) and end_time_order[right-1] <= start:
dp[i] = max_val_list[-1] + item_list[i][2]
elif right < len(max_val_list) and right > 0:
dp[i] = max_val_list[right-1] + item_list[i][2]
max_val = max(max_val,dp[i])
max_val_list.append(max_val)
#dp[i] = max(dp[i],dp[i-1])
#print dp
#print max_val_list
return max(dp)
【leetcode】1235. Maximum Profit in Job Scheduling的更多相关文章
- 【leetcode】998. Maximum Binary Tree II
题目如下: We are given the root node of a maximum tree: a tree where every node has a value greater than ...
- 【LeetCode】895. Maximum Frequency Stack 解题报告(Python)
[LeetCode]895. Maximum Frequency Stack 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxueming ...
- 【LeetCode】718. Maximum Length of Repeated Subarray 解题报告(Python)
[LeetCode]718. Maximum Length of Repeated Subarray 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxu ...
- 【LeetCode】662. Maximum Width of Binary Tree 解题报告(Python)
[LeetCode]662. Maximum Width of Binary Tree 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.co ...
- 【Leetcode】164. Maximum Gap 【基数排序】
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- 【leetcode】1255. Maximum Score Words Formed by Letters
题目如下: Given a list of words, list of single letters (might be repeating) and score of every charact ...
- 【leetcode】1189. Maximum Number of Balloons
题目如下: Given a string text, you want to use the characters of text to form as many instances of the w ...
- 【LeetCode】1161. Maximum Level Sum of a Binary Tree 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS 日期 题目地址:https://leetcod ...
- 【LeetCode】104. Maximum Depth of Binary Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:BFS 方法二:DFS 参考资料 日期 题目 ...
随机推荐
- 【C/C++】什么是线程安全
<strong>线程安全</strong>就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不 ...
- mint ui解决Navbar和Infinite scroll共存时的bug
Navbar和Infinite scroll共同使用时会出现无限加载的问题,滑动也会出现乱加载. 只需要判断一下就可以了,代码: html: <mt-navbar v-model="s ...
- Object的构造函数方法
参考自MDN Object 构造函数的方法 1.Object.assign() 将可枚举属性的值从一个或多个源对象复制到目标对象. 2.Object.create() 创建一个新对象,继承现有对象的构 ...
- CDH6.2的配置
访问node1: 192.168.56.11:7180 Username: admin Password: admin#进入欢迎界面 Welcome--Accept License 选免费版 Add ...
- jenkins和gitlab备份
#把/opt目录拷贝到10.0.0.31的/tmp下. rsync -avz /opt root@10.0.0.31:/tmp/ pull: rsync -avz root@10.0.0.31: ...
- node项目自动化部署--基于Jenkins,Docker,Github(3)自动化部署
GitHub仓库 由于现在的代码基本上都是多人合作开发,所以肯定会用到像 git 这样的版本控制工具 所以这里使用 GitHub 来做一个演示 首先我们需要在github上新建一个仓库 点击New来新 ...
- cut,sort,awk,sed,tr,find,wc,uniq在Linux中的用法
cut语法cut [-bn] [file]cut [-c] [file]cut [-df] [file] -b :以字节为单位进行分割.这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志.-c ...
- MySQL性能优化(二):优化数据库的设计
原文:MySQL性能优化(二):优化数据库的设计 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.n ...
- python字典保存至json文件
import os import json class SaveJson(object): def save_file(self, path, item): # 先将字典对象转化为可写入文本的字符串 ...
- O008、LVM类型的Storage Pool
参考https://www.cnblogs.com/CloudMan6/p/5277927.html LVM类型的Storage Pool 不仅一个文件可以分配给客户机作为虚拟磁盘,宿主机上 ...


