630. Course Schedule III
There are n different online courses numbered from 1 to n. Each course has some duration(course length) t and closed on dth day. A course should be taken continuously for t days and must be finished before or on the dth day. You will start at the 1st day.
Given n online courses represented by pairs (t,d), your task is to find the maximal number of courses that can be taken.
Example:
Input: [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]
Output: 3
Explanation:
There're totally 4 courses, but you can take 3 courses at most:
First, take the 1st course, it costs 100 days so you will finish it on the 100th day, and ready to take the next course on the 101st day.
Second, take the 3rd course, it costs 1000 days so you will finish it on the 1100th day, and ready to take the next course on the 1101st day.
Third, take the 2nd course, it costs 200 days so you will finish it on the 1300th day.
The 4th course cannot be taken now, since you will finish it on the 3300th day, which exceeds the closed date.
Note:
- The integer 1 <= d, t, n <= 10,000.
- You can't take two courses simultaneously.
Approach #1: C++. Using Recursion with memoization[memory Limit Exceeded]
class Solution {
public:
int scheduleCourse(vector<vector<int>>& courses) {
int m = courses.size();
if (m == 0) return 0;
sort(courses.begin(), courses.end(), [](const auto& a, const auto& b) { return a[1] < b[1]; });
vector<vector<int>> memo(m, vector<int>(courses[m-1][1]+1, 0));
return schedule(courses, 0, 0, memo);
}
int schedule(const vector<vector<int>>& courses, int i, int time, vector<vector<int>>& memo) {
if (i == courses.size()) return 0;
if (memo[i][time] != 0) return memo[i][time];
int taken = 0;
if (time + courses[i][0] <= courses[i][1])
taken = 1 + schedule(courses, i + 1, time + courses[i][0], memo);
int not_taken = schedule(courses, i + 1, time, memo);
memo[i][time] = max(taken, not_taken);
return memo[i][time];
}
};
Approach #2: Java. Iterative Solution [Time Limit Exceeded]
class Solution {
public int scheduleCourse(int[][] courses) {
Arrays.sort(courses, (a, b) -> a[1] - b[1]);
int time = 0, count = 0;
for (int i = 0; i < courses.length; ++i) {
if (time + courses[i][0] <= courses[i][1]) {
time += courses[i][0];
count++;
} else {
int max_i = i;
for (int j = 0; j < i; ++j) {
if (courses[j][0] > courses[max_i][0])
max_i = j;
}
if (courses[max_i][0] > courses[i][0])
time += courses[i][0] - courses[max_i][0];
courses[max_i][0] = -1;
}
}
return count;
}
}
Approach #3 C++. [priority_queue]
class Solution {
public:
int scheduleCourse(vector<vector<int>>& courses) {
int m = courses.size();
if (m == 0) return 0;
sort(courses.begin(), courses.end(), [](const auto& a, const auto& b) { return a[1] < b[1]; });
priority_queue<int> pq;
int time = 0, count = 0;
for (auto course : courses) {
if (time + course[0] <= course[1]) {
count++;
time += course[0];
pq.push(course[0]);
} else {
if (!pq.empty() && pq.top() > course[0]) {
time += course[0] - pq.top();
//cout << pq.top() << endl;
pq.pop();
pq.push(course[0]);
}
}
}
return count;
}
};
Analysis:
First: sorting the courses with the end time form little to big.
Second: we use a variable time to mark up the current time. If time + course[0] <= course[1], we update the ans and time. otherwise, we find out the max duration in the pass courses we have taken. (we can use priority_queue to maintain the max duration)
Thrid: we add the course[0] to the time and push it to priority_queue then we subtract the max duration from time and pop it from the priority_queue.
reference:
https://leetcode.com/problems/course-schedule-iii/solution/
630. Course Schedule III的更多相关文章
- [LeetCode] Course Schedule III 课程清单之三
There are n different online courses numbered from 1 to n. Each course has some duration(course leng ...
- [leetcode-630-Course Schedule III]
There are n different online courses numbered from 1 to n. Each course has some duration(course leng ...
- [Swift]LeetCode630. 课程表 III | Course Schedule III
There are n different online courses numbered from 1 to n. Each course has some duration(course leng ...
- 贪心-Course Schedule III
2020-02-01 21:37:39 问题描述: 问题求解: 对于课程来说截止时间在前面的肯定需要优先安排,所以首先需要将courses按照deadline进行排序. 然后只需要不断的加入当前的课程 ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- 算法与数据结构基础 - 贪心(Greedy)
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
- leetcode 学习心得 (3)
源代码地址:https://github.com/hopebo/hopelee 语言:C++ 517. Super Washing Machines You have n super washing ...
- leetcode hard
# Title Solution Acceptance Difficulty Frequency 4 Median of Two Sorted Arrays 27.2% Hard ...
随机推荐
- 整合多个py文件接口的unittest。suite执行方法
1.每个接口用例为一个.py文件.内容如下: getAdMakeMoneyList文件: # coding=utf-8import xlrdimport requestsimport unittest ...
- Linux - 用户的增删改查及组的相关操作
useradd:新增一个用户 useradd 几个常用的参数: -u:指定用户的 uid -g:指定用户所属的组 -d:指定用户的家目录 -c:指定用户的备注信息 -s:指定用户所用的 shell [ ...
- ceph 创建和删除osd
ceph 创建和删除osd 1.概述 本次主要是使用ceph-deploy工具和使用ceph的相关命令实现在主机上指定磁盘创建和删除osd,本次以主机172.16.1.96(主机名ha ...
- storm集群配置以及java编写拓扑例子
storm集群配置 安装 修改配置文件 使用java编写拓扑 storm集群配置 storm配置相当简单 安装 tar -zxvf apache-storm-1.2.2.tar.gz rm apach ...
- jqurey datatable tableTools 自定义button元素 以及按钮定义事件
版本 1.10.4 "dom": 'T<"clear">lfrtip', "tableTools": { //"sSw ...
- OpenGL ES & SDL(转载)
原帖:http://qqwt.blog.sohu.com/91060365.html 这个学期在学习嵌入式,由于老师的高要求.所以我们几个水手必须要完成一个项目,名字就叫OpenGL ES & ...
- 4-3 线程安全性-原子性-synchronized
原子性它提供了互斥访问,同一时刻只能有一个线程来对它进行操作.能保证同一时刻只有一个线程来对其进行操作的,除了Atomic包之外,还有锁.JDK提供锁主要分两种,synchronized是一个Java ...
- 【bzoj1787】[Ahoi2008]Meet 紧急集合
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2466 Solved: 1117[Submit] ...
- 六.使用list和tuple
list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: classmates = ...
- Mask_RCNN caffe2
cd DETECTRON/detectron/ python2 tools/infer_simple_ip_camera.py \ --cfg configs/12_2017_baselines ...