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

想要精通算法和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.rhkb.cn/news/127871.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装程序报错“E: Sub-process /usr/bin/dpkg returned an error code (1)”的解决办法

今天在终端使用命令安装程序时出现了如下的报错信息。 E: Sub-process /usr/bin/dpkg returned an error code (1) 这种情况下安装什么程序最终都会报这个错&#xff0c;具体的报错截图如下图所示。 要解决这个问题&#xff0c;首先使用下面的命令进到相应的目录下。 cd /var/…

使用openWRT 配置SFTP 实现远程文件安全传输

文章目录 前言 1. openssh-sftp-server 安装2. 安装cpolar工具3.配置SFTP远程访问4.固定远程连接地址 前言 本次教程我们将在OpenWRT上安装SFTP服务&#xff0c;并结合cpolar内网穿透&#xff0c;创建安全隧道映射22端口&#xff0c;实现在公网环境下远程OpenWRT SFTP&#xf…

生信豆芽菜-机器学习筛选特征基因

网址&#xff1a;http://www.sxdyc.com/mlscreenfeature 一、使用方法 1、准备数据 第一个文件&#xff1a;特征表达数据 第二个文件&#xff1a;分组信息&#xff0c;第一列为样本名&#xff0c;第二列为患者分组 第三个文件&#xff1a;分析基因名 2、选择机器学习的方…

PHP设备检验系统Dreamweaver开发mysql数据库web结构php编程计算机网页代码

一、源码特点 PHP设备检验系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88306259 php设备检验系统1 …

企业应用系统 PHP项目支持管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 项目支持管理系统是一套完善的web设计系统 应用于企业项目管理&#xff0c;从企业内部的各个业务环境总体掌握&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php项目支撑管理系统2 二、功能介绍 (1)权限管理&#xff1…

深度学习-4-二维目标检测-YOLOv5理论模型详解

YOLOv5理论模型详解 1.Yolov5四种网络模型 Yolov5官方代码中&#xff0c;给出的目标检测网络中一共有4个版本&#xff0c;分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x四个模型。 YOLOv5系列的四个模型&#xff08;YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x&#xff09;在参数量和性…

进阶C语言-指针的进阶(中)

指针的进阶 &#x1f4d6;5.函数指针&#x1f4d6;6.函数指针数组&#x1f4d6;7.指向函数指针数组的指针&#x1f4d6;8.回调函数 &#x1f4d6;5.函数指针 数组指针 - 指向数组的指针 - 存放的是数组的地址 - &数组名就是数组的地址。 函数指针 - 指向函数的指针 - 存放的…

【react】Hooks原理和实战

前言 在最初学习react的时候&#xff0c;我们大部分会选择去扒一扒React的官方文档&#xff0c;看看他是什么&#xff0c;怎么使用的。而我却很好奇在文档里学习的第一个完整的组件是 类&#xff08;Class&#xff09;组件&#xff0c;但是在实际工作中我们看到项目中所声明的…

OpenCV 02(色彩空间)

一、OpenCV的色彩空间 1.1 RGB和BGR 最常见的色彩空间就是RGB, 人眼也是基于RGB的色彩空间去分辨颜色的. OpenCV默认使用的是BGR. BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同. 显示图片的时候需要注意适配图片的色彩空间和显示环境的色彩空间.比如传入的图片…

瑞吉外卖第二天

问题分析 前面我们已经完成了后台系统的员工登录功能开发&#xff0c;但是目前还存在一个问题&#xff0c;接下来我们来说明一个这个问题&#xff0c; 以及如何处理。 1). 目前现状 用户如果不登录&#xff0c;直接访问系统首页面&#xff0c;照样可以正常访问。 2). 理想…

Redux中间件源码解析与实现

基本介绍 本文中涉及到的关键npm包的版本信息如下&#xff1a; react 的版本为18.2.0 redux的版本为4.1.2 redux-thunk版本为2.4.2 redux-promise版本为0.6.0 redux-logger版本为3.0.6 在Redux源码解析与实现&#xff08;一&#xff09;Redux源码解析与实现&#xff08;二&…

基于任务队列的机器学习服务实现

将机器模型部署到生产环境的方法有很多。 常见的方法之一是将其实现为 Web 服务。 最流行的类型是 REST API。 它的作用是全天候&#xff08;24/7&#xff09;部署和运行&#xff0c;等待接收来自客户端的 JSON 请求&#xff0c;提取输入&#xff0c;并将其发送到 ML 模型以预测…

词!自然语言处理之词全解和Python实战!

目录 一、为什么我们需要了解“词”的各个方面词是语言的基础单位词的多维特性词在NLP应用中的关键作用 二、词的基础什么是词&#xff1f;定义分类 词的形态词根、词干和词缀形态生成 词的词性 三、词语处理技术词语规范化定义方法 词语切分&#xff08;Tokenization&#xff…

网络安全合规-DSMM

DSMM&#xff08;Data Security Management Model&#xff09;是一种数据安全管理模型。该模型以数据为中心&#xff0c;从数据的生命周期入手&#xff0c;从数据发布、使用、共享、存储、删除等几个方面来管理数据安全。 DSMM提供了一些有效的数据安全管理原则和策略&#xf…

用通俗易懂的方式讲解大模型分布式训练并行技术:数据并行

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…

文生图模型进化简史和生成能力比较——艺术肖像篇

很久没有更新文章&#xff0c;最近真的太忙啦&#xff0c;在T2I领域&#xff0c;学习速度真的赶不上进化速度&#xff01;每天都有无数新模型、新插件、新玩法涌现。玩得太上瘾啦。 上月初我去参加我硕士专业的夏季烧烤大趴&#xff0c;跟我的论文导师重逢&#xff08;好多年没…

医院信息化、数字医学影像、DICOM、PACS源码

PACS系统适合卫生院、民营医院、二甲或以下公立医院的放射科、超声科使用。功能强大且简洁&#xff0c;性能优异&#xff0c;具备MPR&#xff08;三维重建&#xff09;、VR&#xff08;容积重建&#xff09;、胶片打印功能&#xff0c;能够快速部署。 PACS系统支持DR、CT、磁共…

Kafka入门,这一篇就够了(安装,topic,生产者,消费者)

目录 Kafka的安装文件与配置目录binconfig 配置文件server.propertiesproducer.propertiesconsumer.properties 命令行简单使用kafka-topics.sh新增查看列表查看详情修改删除 kafka-console-producer.shkafka-console-consumer.sh 概念集群代理broker主题topic分区partition偏移…

android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程

官网参考链接&#xff1a;https://developer.android.google.cn/develop/ui/views/appwidgets/overview 1、什么是小部件 App widgets are miniature application views that can be embedded in other applications (such as the home screen) and receive periodic updates…

什么是Linux

什么是Linux&#xff1f; 不知道大家是什么时候开始接触Linux&#xff0c;我记得我是大三的时候&#xff0c;那时候通过国嵌、韦东山的教学视频&#xff0c;跟着搭bootloader&#xff0c;修改内核&#xff0c;制作根文件系统&#xff0c;一步步&#xff0c;视频真的很简单&…