想要精通算法和SQL的成长之路 - 课程表III

news2025/1/18 8:07:30

想要精通算法和SQL的成长之路 - 课程表III

  • 前言
  • 一. 课程表III(贪心+优先队列)
    • 1.1 优先选择截止时间更小的课程
    • 1.2 如果当前课程无法学习怎么办?
    • 1.3 优化

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 课程表III(贪心+优先队列)

原题链接
在这里插入图片描述

我们来分析一下题目:

  1. 我们同一时间只能学习一种课程。
  2. 题目中courses是一个二维数组。每个小数组中,第一个数值代表:学习该课程的持续时间。第二个数值代表学习该课程的最晚时间。

1.1 优先选择截止时间更小的课程

那么我们应该如何优先选择要学习的课程?

  • 优先选择截止时间早的课程。

例如有两个课程:[1,2] ,[3,6]

  • 如果先学前者:两个课程都可以学完,耗时总时间为 1+3 < 6
  • 如果先学后者:第二个课程耗时3天。已经超过第一个课程的截止日期。那么第一个课程就无法学习。

那么对于代码而言,我们需要对二维数组courses的第二个值做一个升序排序。然后我们从左往右选择课程去学习。

因此,我们首先应该对二维数组做一个排序:

Arrays.sort(courses, Comparator.comparingInt(a -> a[1]));

1.2 如果当前课程无法学习怎么办?

我们给个例子,有三个课程:[1,2] 、[3, 4]、[2, 5]。按照截止日期升序排序。

  1. 这时候,当选择到第三门课程的时候,发现 1 + 3 + 2 > 5 ,即第三个课程我们无法学习。那这时候咋办?
  2. 我们应该永远遵循一个规则:在学习相同个数课程的前提下,我们耗时应该越短越好。 为啥?前面的耗时短了,就有更多的时间给后面的课程学习了。
  3. 那么我们就应该和上一个课程作比较。 [3, 4]、[2, 5] 中,我们应该优先选择耗时更短的课程,即 [2,5]

讲到这里,我们就意识到,在程序编码过程中:

  1. 我们需要记录我们已经选过的课程以及目前学习的总耗时。
  2. 同时我们还要对我们选过的课程的耗时做一个升序排序。即大根堆
// 大根堆,学习时长更长的在堆顶
PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> b[0] - a[0]);
// 学习总耗时
int total = 0;
  1. 如果发现当前课程耗时比堆顶元素的耗时更短,那么择优选择当前课程。
for (int[] c : courses) {
    int duration = c[0];
    int lastDay = c[1];
    if (total + duration <= lastDay) {
        // 记录当前的学习总耗时还有课程
        total += duration;
        heap.offer(c);
    } else if (!heap.isEmpty() && heap.peek()[0] > duration) {
        // 若当前课程学习不了,那么拿当前堆顶元素(耗时最大)和当前课程的耗时作比较。若当前耗时更短。那么择优选择当前课程
        total = total - heap.poll()[0] + duration;
        heap.offer(c);
    }
}

最后返回堆的大小,即是选择的课程数量:

return heap.size();

完整代码如下:

public class Test630 {
    public int scheduleCourse(int[][] courses) {
        // 根据第二个值进行升序
        Arrays.sort(courses, Comparator.comparingInt(a -> a[1]));
        // 大根堆,学习时长更长的在堆顶
        PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> b[0] - a[0]);
        // 学习总耗时
        int total = 0;
        for (int[] c : courses) {
            int duration = c[0];
            int lastDay = c[1];
            if (total + duration <= lastDay) {
                // 记录当前的学习总耗时还有课程
                total += duration;
                heap.offer(c);
            } else if (!heap.isEmpty() && heap.peek()[0] > duration) {
                // 若当前课程学习不了,那么拿当前堆顶元素(耗时最大)和当前课程的耗时作比较。若当前耗时更短。那么择优选择当前课程
                total = total - heap.poll()[0] + duration;
                heap.offer(c);
            }
        }
        return heap.size();
    }
}

1.3 优化

  1. 其实我们的大根堆并不需要存储一个数组,我们只关心它的耗时时长。
  2. 既然我们用大根堆(升序)去存储学习的课程了。我们可以不用自己去判断:当前课程的耗时 < 堆顶元素的耗时。我们直接无脑把当前课程丢给大根堆,让他自己做排序,然后无脑弹出堆顶元素(耗时最长)即可呀。因为弹出的元素也可能是当前课程。
  3. 说白了就是把比较的操作丢给了大根堆。
public class Test630 {
    public int scheduleCourse(int[][] courses) {
        // 根据第二个值进行升序
        Arrays.sort(courses, Comparator.comparingInt(a -> a[1]));
        // 大根堆,学习时长更长的在堆顶
        PriorityQueue<Integer> heap = new PriorityQueue<>((a, b) -> b - a);
        // 学习总耗时
        int total = 0;
        for (int[] c : courses) {
            int duration = c[0], lastDay = c[1];
            total += duration;
            heap.offer(duration);
            if (total > lastDay) {
                total -= heap.poll();
            }
        }
        return heap.size();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/997799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ArcGIS pro】-使用arcpy一次保存多个布局

在arcgis Pro中常常会创建多个地图和多个布局&#xff0c;本文介绍如何使用代码&#xff0c;一次保存多个布局文件 在arcgis pro中打开python视图 找到工程位置 在python视图中输入如下代码 保存为pdf import arcpy# 设置当前项目&#xff0c;这通常是一个.aprx文件 projec…

11.Xaml DatePicker控件 时间控件

1.运行效果 2.运行源码 a.Xaml源码 <Grid Name="Grid1"><!--DisplayDate="2020-5-1" 显示的日期--><!--DisplayDateStart="2020

Linux CentOS7 添加中文输入法

在安装CentOS7时&#xff0c;现在默认安装了桌面中文系统。可以切换为英文&#xff0c;中英文可以按要求随时更换。而在CentOS7桌面环境下&#xff0c;显示中文非常方便、正确&#xff0c;并不能录入中文。 在远程登录系统的情况下&#xff0c;不论是系统语言&#xff08;LANG…

Vue2电商前台项目——完成Home首页模块业务

Vue2电商前台项目——完成Home首页模块业务 Vue基础知识点击此处——Vue.js 文章目录 Vue2电商前台项目——完成Home首页模块业务一、项目开发的步骤二、Home首页拆分静态组件1、完成TypeNav三级联动组件&#xff1a;全局组件2、完成其余静态组件&#xff1a;局部组件 三、请求…

黑马JVM总结(四)

&#xff08;1&#xff09;本地方法栈 Java虚拟机调用本地方法时&#xff0c;给本地方法提供的一个内存空间&#xff0c;本地方法它是指哪些不是由java代码编写的方法 java代码有一定限制&#xff0c;它有时候不能直接跟操作系统底层打交道&#xff0c;需要用c和c语言编写的本…

《C和指针》笔记23: 指针的指针

int a 12; int *b &a;现在有了第三个变量c c &b;c的类型是什么&#xff1f;显然它是一个指针&#xff0c;但它所指向的是什么&#xff1f;变量b是一个“指向整型的指针”&#xff0c;所以任何指向b的类型必须是指向“指向整型的指针”的指针&#xff0c;更通俗地说…

D. Paths on the Tree

Problem - 1746D - Codeforces 思路&#xff1a;先分析一下题意&#xff0c;根据第一条性质&#xff0c;每次只能够从1开始&#xff0c;而第二条性质则表明对于每个节点来说&#xff0c;经过这个节点的子节点的路径条数应该尽量均衡&#xff0c;最大值与最小值相差不能超过1&am…

水浒传之“领导力的定义:梁山集团三代领导人的特点”

周末快乐&#xff0c;我是老原。 周末修整&#xff0c;也不要忘记给自己的大脑充个电。 最近空闲时间看《水浒传》&#xff0c;有了一些关于领导力的感悟。 一提到领导力&#xff0c;有人可能会认为&#xff0c;这是企业领导才需要掌握的能力。 其实并不是。 领导力可以体…

liunx系统无sudo或管理员权限安装rar解压安装包

liunx无sudo权限安装rar解压安装包 &#xff08;1&#xff09;正常liunx安装rar&#xff08;2&#xff09;无sudo\root(管理员身份)时如何安装rar &#xff08;1&#xff09;正常liunx安装rar 1、下载安装包 WinRAR archiver, a powerful tool to process RAR and ZIP files (r…

C#类与类库调用注意事项

类 创建一个类文件&#xff0c;myfunction.cs //静态类&#xff1a;直接引用、无需实例化 static public int jiafa(int V) //普通类&#xff1a;引用时需要实例化 public int jiafa(int V)using System; using System.Collections.Generic; using System.Diagnostics; using …

VS Code 配置 JAVA(总)

VS Code 配置 JAVA&#xff08;总&#xff09; 主要参考&#xff1a; 处理单独 java 源文件的vscode配置VScode关于 java 配置的总体说明安装多版本 jdk 后&#xff0c;如何指定使用某个版本&#xff1f;某些与java相关的有用扩展VS code 如何配置不同编程语言及其工作流程 …

运维必备 | 使用 ansible 自动化批量执行工具,提升企业运维工作效率

各位亲爱的读者&#xff0c;现在公众号更改了推送规则&#xff0c;如果您需要第一时间看到我们推送的好内容。 一定要记得给公众号星标&#xff0c;经常点赞、在看、转发、分享和留下您的评论 &#xff01; 关注回复【学习交流群】加入【安全开发运维】答疑交流群 请朋友们【多…

买卖股票的最佳时机含冷冻期

题目链接 买卖股票的最佳时机含冷冻期 题目描述 注意点 卖出股票后&#xff0c;无法在第二天买入股票 (即冷冻期为 1 天)不能同时参与多笔交易&#xff08;必须在再次购买前出售掉之前的股票&#xff09;可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09…

l8-d11 TCP连接管理与UDP协议

一、三次握手 TCP 建立连接的过程叫做握手。 采用三报文握手&#xff1a;在客户和服务器之间交换三个 TCP 报文段&#xff0c;以防止已失效的连接请求报文段突然又传送到了&#xff0c;因而产生 TCP 连接建立错误。 二、四次挥手 TCP 连接释放过程比较复杂。 数据传输结束后…

2、k-means聚类算法sklearn与手动实现

本文将对k-means聚类算法原理和实现过程进行简述 算法原理 k-means算法原理较简单&#xff0c;基本步骤如下&#xff1a; 1、假定我们要对N个样本观测做聚类&#xff0c;要求聚为K类&#xff0c;首先选择K个点作为初始中心点&#xff1b; 2、接下来&#xff0c;按照距离初始中…

蓝桥杯官网填空题(三角形的面积)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 已知三角形三个顶点在直角坐标系下的坐标分别为&#xff1a; txt (2.3, 2.5) (6.4, 3.1) (5.1, 7.2) txt 求该三角形的面积。 注意&#xff0c;要提交的是一个小…

解决ROS2 humble版本源码编译中resdep init及rosdep update失败的问题

网上有在/etc/hosts中添加ip地址的方法&#xff0c;使用了不成功&#xff0c;具体做法如下&#xff0c;仅供参考&#xff1a; a.打开查询ip的网址&#xff1a; https://site.ip138.com b.输入&#xff1a;raw.githubusercontent.com c.执行sudo vi /etc/hosts 将获取到的ip添…

docker系列(3) - 常用软件安装

文章目录 3. docker安装常用软件3.1 安装nginx3.2 安装redis3.3 安装mysql3.4 部署springboot程序3.4.1 编写dockerfile3.4.2 构建镜像3.4.3 启动镜像 3. docker安装常用软件 3.1 安装nginx docker pull nginx#挂载启动 docker run -it -d \ --namenginx \ --networkpub_netw…

L2 数据仓库和Hive环境配置

1.数据仓库架构 数据仓库DW主要是一个用于存储&#xff0c;分析&#xff0c;报告的数据系统。数据仓库的目的是面向分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持。-DW不产生和消耗数据 结构数据&#xff1a;数据库中数据&#xff0c;CSV文件 直接导入DW非结构…

2023高教杯数学建模2:DE题+参考论文、代码

2023高教杯数学建模2&#xff1a;DE题 写在最前面E题D题2014C题优秀论文笔记问题一&#xff08;求解母猪年均产仔量以达到或超过盈亏平衡点&#xff09;问题二&#xff08;求解小猪选为种猪的比例和母猪的存栏数&#xff09;问题三&#xff08;确定最佳经营策略&#xff0c;计算…