avatar
我给大家讲道题吧。# JobHunting - 待字闺中
D*0
1
course-schedule-iii
题目的意思就是说:
给定一堆 长度为2的二维数组。
数组表示:[这个课程所需时间, 这个课程的截止日期]
问,最多能上多少门课。
解题用了贪心法:
首先对把所有的课程按照截止日期排序, 截止日期早的放前面。
然后建立一个最大堆。 堆顶是耗时间最长的课程。
维持一个变量 time 用来记录当前所有的课程总共消耗了多少时间。
如果当先总共消耗的时间 超过了当前课程的截止日期。 我们就把当前选了的课程中
最费时间的课程退掉。
最后堆里有多少门课,就是我们最多能选的课程数量。
代码如下:
class Solution {
public int scheduleCourse(int[][] courses) {
Arrays.sort(courses, (n1, n2) -> n1[1]- n2[1]);
PriorityQueue pq = new PriorityQueue<>((a,b) -> b[0]-a[0]);
int time = 0;
for (int[] course : courses) {
time += course[0];
pq.offer(course);
if (time > course[1]) {
time -= pq.poll()[0];
}
}
return pq.size();
}
}
avatar
t*b
2
这么刷题可不行 楼主能不能说一下
这个题贪心的正确性是什么
这个题和前面俩题的区别是什么
avatar
z*o
3
好像哪里不对
avatar
D*0
4
哪里不对,请指示。

【在 z*******o 的大作中提到】
: 好像哪里不对
avatar
D*0
5
好问题。

【在 t****b 的大作中提到】
: 这么刷题可不行 楼主能不能说一下
: 这个题贪心的正确性是什么
: 这个题和前面俩题的区别是什么

avatar
k*u
6
不错不错,要是能能说说逻辑推理为什么贪心算法这么些就更好了
avatar
k*u
7
leetcode 原题吧 应该是没有问题的

【在 D**********0 的大作中提到】
: 哪里不对,请指示。
avatar
z*o
8
不是应该先比较堆顶吗?
如果大,先把堆顶弹出,然后在加. 你这是先加啊.

【在 D**********0 的大作中提到】
: 哪里不对,请指示。
avatar
D*0
9
我想是因为是每个课的权重都是1。
那么如果当前累加的课程超过 截止日期的话。
肯定是要把最费时间的哪一门退掉。
以便后面的课程可以有更多的上课时间。
[500, 500] [100, 550] [x, y]
比如说在第二门课程的时候, 总时间是600, 第二门课需要在第550分钟之前完成。
那么,肯定是drop掉耗时比较多的第一门课,以便于之后可以达到 y 的要求,再多选
一门。

【在 k*****u 的大作中提到】
: 不错不错,要是能能说说逻辑推理为什么贪心算法这么些就更好了
avatar
D*0
10
嗯,有道理。

【在 z*******o 的大作中提到】
: 不是应该先比较堆顶吗?
: 如果大,先把堆顶弹出,然后在加. 你这是先加啊.

avatar
k*u
11
这个有影响吗
,,吗,

【在 D**********0 的大作中提到】
: 嗯,有道理。
avatar
z*n
12

没看lz代码,模糊的印象里是必须先加再pop才对。

【在 z*******o 的大作中提到】
: 不是应该先比较堆顶吗?
: 如果大,先把堆顶弹出,然后在加. 你这是先加啊.

avatar
D*0
13
应该都可以。
先进堆就用堆比较,否则就手动比较一下。总体效率没差。

【在 z*********n 的大作中提到】
:
: 没看lz代码,模糊的印象里是必须先加再pop才对。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。