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:

  1. The integer 1 <= d, t, n <= 10,000.
  2. 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的更多相关文章

  1. [LeetCode] Course Schedule III 课程清单之三

    There are n different online courses numbered from 1 to n. Each course has some duration(course leng ...

  2. [leetcode-630-Course Schedule III]

    There are n different online courses numbered from 1 to n. Each course has some duration(course leng ...

  3. [Swift]LeetCode630. 课程表 III | Course Schedule III

    There are n different online courses numbered from 1 to n. Each course has some duration(course leng ...

  4. 贪心-Course Schedule III

    2020-02-01 21:37:39 问题描述: 问题求解: 对于课程来说截止时间在前面的肯定需要优先安排,所以首先需要将courses按照deadline进行排序. 然后只需要不断的加入当前的课程 ...

  5. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  6. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  7. All LeetCode Questions List 题目汇总

    All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...

  8. leetcode 学习心得 (3)

    源代码地址:https://github.com/hopebo/hopelee 语言:C++ 517. Super Washing Machines You have n super washing ...

  9. leetcode hard

    # Title Solution Acceptance Difficulty Frequency     4 Median of Two Sorted Arrays       27.2% Hard ...

随机推荐

  1. GNS3连接虚拟机

      打开GNS3,拖一台路由器和主机   右击主机,选择配置   添加虚拟机的网卡为主机网卡,(选择VM1或VM8)   路由器选择虚拟机网卡连接   打开虚拟机在导航栏找到“虚拟机”-->“设 ...

  2. Halcon学习之两幅图像处理

    sub_image ( ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : ) 对两幅图像做减法   g' := (g1 - g2) * Mu ...

  3. Checker Challenge跳棋的挑战(n皇后问题)

    Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...

  4. 创建maven工程时报错,解决方案

    解决思路:在本地库中装载maven-archetype-quickstart 1.从 http://mirrors.ibiblio.org/pub/mirrors/maven2/org/apache/ ...

  5. jetbrains idea/webstorm等(注册,激活,破解码,一起支持正版,最新可用)(2017.3.16更新)【转】

    选择 License server (2017.3.16更新) http://idea.imsxm.com/ 详细请参考:  http://www.cnblogs.com/ys-wuhan/p/584 ...

  6. sql合并列

    oralce写法: select WM_CONCAT(A.title) as citys from tmpcity A sql server写法: select stuff((select ','+A ...

  7. 判断手机使用网络wifi 2G 3G

    ConnectivityManager cManager = (ConnectivityManager) this .getSystemService(Context.CONNECTIVITY_SER ...

  8. solrcloud上传collection配置

    建议:上传多个collection的配置文件,建议修改配置文件名字,在solr.xml中按照文件名来引用collection对应的schema和solrconfig.xml文件,这样无论你多个coll ...

  9. ubuntu16.04 Mask_RCNN AlphaPose OpenPose Librealsense

    #############MaskRCNNcource activate flappbirdcd /home/luo/Desktop/MyFile/MaskRCNN/MyOwnMaskRCNN1/sa ...

  10. mysql for visual

    http://dev.mysql.com/downloads/file.php?id=458484