Python每日一练(20230505) 课程表 Course Schedule III/IV

这篇具有很好参考价值的文章主要介绍了Python每日一练(20230505) 课程表 Course Schedule III/IV。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python每日一练(20230505) 课程表 Course Schedule III/IV

目录

3. 课程表 Course Schedule III

4. 课程表 Course Schedule IV

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


3. 课程表 Course Schedule III

这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。

你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。

返回你最多可以修读的课程数目。

示例 1:

输入:courses = [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]
输出:3
解释:
这里一共有 4 门课程,但是你最多可以修 3 门:
首先,修第 1 门课,耗费 100 天,在第 100 天完成,在第 101 天开始下门课。
第二,修第 3 门课,耗费 1000 天,在第 1100 天完成,在第 1101 天开始下门课程。
第三,修第 2 门课,耗时 200 天,在第 1300 天完成。
第 4 门课现在不能修,因为将会在第 3300 天完成它,这已经超出了关闭日期。

示例 2:

输入:courses = [[1,2]]
输出:1

示例 3:

输入:courses = [[3,2],[4,3]]
输出:0

提示:

  • 1 <= courses.length <= 10^4
  • 1 <= durationi, lastDayi <= 10^4

代码: 贪心算法

package main

import (
	"fmt"
	"sort"
)

func scheduleCourse(courses [][]int) int {
	// 按照截止日期升序排序
	sort.Slice(courses, func(i, j int) bool {
		return courses[i][1] < courses[j][1]
	})

	time := 0
	selected := make([][]int, 0)
	for _, c := range courses {
		if time+c[0] <= c[1] {
			selected = append(selected, []int{c[0], c[1]})
			time += c[0]
			sort.Slice(selected, func(i, j int) bool {
				return selected[i][0] > selected[j][0]
			})
		} else if len(selected) > 0 && c[0] < selected[0][0] {
			time += c[0] - selected[0][0]
			selected[0] = []int{c[0], c[1]}
			sort.Slice(selected, func(i, j int) bool {
				return selected[i][0] > selected[j][0]
			})
		}
	}

	return len(selected)
}

func main() {
	courses := [][]int{{100, 200}, {200, 1300}, {1000, 1250}, {2000, 3200}}
	fmt.Println(scheduleCourse(courses))
	courses = [][]int{{1, 2}}
	fmt.Println(scheduleCourse(courses))
}

输出:

3
1


4. 课程表 Course Schedule IV

你总共需要上 numCourses 门课,课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite ,其中 prerequisites[i] = [ai, bi] 表示如果你想选 bi 课程,你 必须 先选 ai 课程。

  • 有的课会有直接的先修课程,比如如果想上课程 1 ,你必须先上课程 0 ,那么会以 [0,1] 数对的形式给出先修课程数对。

先决条件也可以是 间接 的。如果课程 a 是课程 b 的先决条件,课程 b 是课程 c 的先决条件,那么课程 a 就是课程 c 的先决条件。

你也得到一个数组 queries ,其中 queries[j] = [uj, vj]。对于第 j 个查询,您应该回答课程 uj 是否是课程 vj 的先决条件。

返回一个布尔数组 answer ,其中 answer[j] 是第 j 个查询的答案。

示例 1:

Python每日一练(20230505) 课程表 Course Schedule III/IV

输入:numCourses = 2, prerequisites = [[1,0]], queries = [[0,1],[1,0]]
输出:[false,true]
解释:课程 0 不是课程 1 的先修课程,但课程 1 是课程 0 的先修课程。

示例 2:

输入:numCourses = 2, prerequisites = [], queries = [[1,0],[0,1]]
输出:[false,false]
解释:没有先修课程对,所以每门课程之间是独立的。

示例 3:

Python每日一练(20230505) 课程表 Course Schedule III/IV

输入:numCourses = 3, prerequisites = [[1,2],[1,0],[2,0]], queries = [[1,0],[1,2]]
输出:[true,true]

提示:

  • 2 <= numCourses <= 100
  • 0 <= prerequisites.length <= (numCourses * (numCourses - 1) / 2)
  • prerequisites[i].length == 2
  • 0 <= ai, bi <= n - 1
  • ai != bi
  • 每一对 [ai, bi] 都 不同
  • 先修课程图中没有环。
  • 0 <= ui, vi <= n - 1
  • ui != vi

代码:

package main

import "fmt"

func checkIfPrerequisite(numCourses int, prerequisites [][]int, queries [][]int) []bool {
	// 构建课程图
	n := numCourses
	graph := make([][]int, n)
	inDegree := make([]int, n)
	for _, p := range prerequisites {
		ai, bi := p[0], p[1]
		graph[ai] = append(graph[ai], bi)
		inDegree[bi]++
	}

	// BFS 拓扑排序
	queue := make([]int, 0)
	for i := 0; i < n; i++ {
		if inDegree[i] == 0 {
			queue = append(queue, i)
		}
	}
	successors := make([][]int, n)
	for len(queue) > 0 {
		node := queue[0]
		queue = queue[1:]
		for _, neighbor := range graph[node] {
			inDegree[neighbor]--
			if inDegree[neighbor] == 0 {
				queue = append(queue, neighbor)
			}
			// 记录 successor 节点
			successors[node] = append(successors[node], neighbor)
			for _, s := range successors[neighbor] {
				successors[node] = append(successors[node], s)
			}
		}
	}

	// 对每个查询进行检查
	result := make([]bool, len(queries))
	for i, q := range queries {
		ui, vi := q[0], q[1]
		for _, s := range successors[ui] {
			if s == vi {
				result[i] = true
				break
			}
		}
	}
	return result
}

func main() {
	numCourses := 2
	prerequisites := [][]int{{1, 0}}
	queries := [][]int{{0, 1}, {1, 0}}
	fmt.Println(checkIfPrerequisite(numCourses, prerequisites, queries))
	prerequisites = [][]int{}
	queries = [][]int{{1, 0}, {0, 1}}
	fmt.Println(checkIfPrerequisite(numCourses, prerequisites, queries))
}

输出:

[false true]
[false false]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/文章来源地址https://www.toymoban.com/news/detail-435017.html

Python每日一练(20230505) 课程表 Course Schedule III/IV

Golang每日一练 专栏

Python每日一练(20230505) 课程表 Course Schedule III/IV

Python每日一练 专栏

Python每日一练(20230505) 课程表 Course Schedule III/IV

C/C++每日一练 专栏

Python每日一练(20230505) 课程表 Course Schedule III/IV

Java每日一练 专栏

到了这里,关于Python每日一练(20230505) 课程表 Course Schedule III/IV的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【力扣热题100】207. 课程表 python 拓扑排序

    刷一道力扣热题100吧 难度中等 https://leetcode.cn/problems/course-schedule/?envType=study-plan-v2envId=top-100-liked 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要

    2024年02月04日
    浏览(45)
  • LeetCode:207. 课程表、210. 课程表 II(拓扑排序 C++)

    目录 207. 课程表 题目描述: 实现代码与解析: 拓扑排序 210. 课程表 II 题目描述: 实现代码与解析: 拓扑排序 原理思路:         你这个学期必须选修  numCourses  门课程,记为  0  到  numCourses - 1  。 在选修某些课程之前需要一些先修课程。 先修课程按数组  prereq

    2024年02月09日
    浏览(43)
  • 自制课程表小程序

    微信开发者工具:稳定版 Stable Build 根据自己电脑的系统下载对应的版本 完整代码连接: https://pan.baidu.com/s/1VbgPOS6CUOae8vg2axhGIg?pwd=hk9e 提取码:hk9e 先把完整代码的压缩包解压,并记住这个路径,后面要用 1.打开下载好的微信开发工具, 注意不要用游客登录 ,我一开始就是游客

    2024年02月09日
    浏览(92)
  • leetcode207. 课程表

    你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先

    2023年04月24日
    浏览(44)
  • 微信小程序实现课程表

    2.1 获取当前日期一周数据 Date.getDay(): getDay() 方法返回指定日期是星期几(从 0 到 6,星期日为 0,星期一为 1,依此类推。)。 Date.getDate(): getDate() 方法返回指定日期在月中的第几天(从 1 到 31)。 Date.setDate(day): setDate() 方法将月份中的某一天设置为日期对象。 Date.getFullYear(

    2024年02月09日
    浏览(51)
  • java实现课程表 II

    题目: 现在你总共有  numCourses  门课需要选,记为  0  到  numCourses - 1 。给你一个数组  prerequisites  ,其中  prerequisites[i] = [ai, bi]  ,表示在选修课程  ai  前  必须  先选修  bi  。 例如,想要学习课程  0  ,你需要先完成课程  1  ,我们用一个匹配来表示: [0,1]  。

    2024年02月09日
    浏览(45)
  • 【图论】Leetcode 207. 课程表【中等】

    你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先

    2024年04月14日
    浏览(47)
  • leetcode 630. 课程表 III

    这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。 你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。 返回你最多可以修读的课

    2024年02月16日
    浏览(43)
  • 刷题笔记25——图论课程表

    为了最终理解你所不理解的,你必须经历一条愚昧无知的道路。为了占有你从未占有的东西,你必须经历被剥夺的道路。为了达到你现在所不在的名位,你必须经历那条你不在其中的道路。——艾略特 非常奇妙,我最初的错误是如下,在找到目标节点后直接加入到res中,但是

    2024年02月07日
    浏览(39)
  • vue实现动态课程表(TimeTable)

      (1)动态生成课程节数、时间周期        (2)遇到学科相等的可进行行合并、已解决合并后表格变形问题 (1)moment

    2024年02月04日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包