【LeetCode每日一题合集】2023.9.11-2023.9.17(⭐反悔贪心拓扑排序Floyd)

文章目录

  • 630. 课程表 III
    • 解法——反悔贪心⭐⭐⭐⭐⭐
  • 1462. 课程表 IV⭐
    • 解法1——拓扑排序预处理
    • 解法2——Floyd算法判断是否存在路径
  • 2596. 检查骑士巡视方案(方向模拟)
  • 1222. 可以攻击国王的皇后(方向模拟)
  • LCP 50. 宝石补给(简单模拟)
  • 198. 打家劫舍(经典线性DP)
  • 213. 打家劫舍 II(循环打家劫舍)
    • 代码写法1——另写方法robR(l, r)
    • 代码写法2——二维dp数组

630. 课程表 III

https://leetcode.cn/problems/course-schedule-iii/description/?envType=daily-question&envId=2023-09-11
在这里插入图片描述

提示:
1 <= courses.length <= 10^4
1 <= durationi, lastDayi <= 10^4

解法——反悔贪心⭐⭐⭐⭐⭐

https://leetcode.cn/problems/course-schedule-iii/solutions/2436667/tan-xin-huan-neng-fan-hui-pythonjavacgoj-lcwp/?envType=daily-question&envId=2023-09-11

class Solution {public int scheduleCourse(int[][] courses) {// 按照截止时间从小到大排序Arrays.sort(courses, (a, b) -> a[1] - b[1]);// 最大堆PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);int day = 0;        // 记录当前使用了多少天for (int[] c: courses) {int d = c[0], t = c[1];if (day + d <= t) {// 如果可以学,直接学day += d;pq.offer(d);} else if (!pq.isEmpty() && pq.peek() > d) {// 如果不可以学,检查已经选了的课程中有没有耗时更长的替换掉day -= pq.poll() - d;pq.offer(d);}}// 最后的答案就是队列中已选课程的数量return pq.size();}
}

更多反悔贪心可见:
【算法】反悔贪心
【力扣周赛】第 357 场周赛(⭐反悔贪心)

1462. 课程表 IV⭐

https://leetcode.cn/problems/course-schedule-iv/?envType=daily-question&envId=2023-09-12
在这里插入图片描述

提示:

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

解法1——拓扑排序预处理

关于拓扑排序可见:【算法基础:搜索与图论】3.3 拓扑排序
在拓扑排序过程中多加一层循环,用来处理各个节点之间是否为先决条件。 回复查询时只需要 O ( 1 ) O(1) O(1)查询。

class Solution {public List<Boolean> checkIfPrerequisite(int numCourses, int[][] prerequisites, int[][] queries) {List<Boolean> ans = new ArrayList<>();List<Integer>[] g = new ArrayList[numCourses];int[] in = new int[numCourses];Arrays.setAll(g, e -> new ArrayList<Integer>());boolean[][] isPre = new boolean[numCourses][numCourses];for (int[] p: prerequisites) {g[p[0]].add(p[1]);in[p[1]]++;isPre[p[0]][p[1]] = true;}// 拓扑排序预处理出n^2各个节点是否是其它节点的先决条件Queue<Integer> q = new LinkedList<>();for (int i = 0; i < numCourses; ++i) {if (in[i] == 0) q.offer(i);}while (!q.isEmpty()) {int x = q.poll();for (int y: g[x]) {for (int i = 0; i < numCourses; ++i) {isPre[i][y] |= isPre[i][x];}if (--in[y] == 0) q.offer(y);}}// O(1) 回答查询for (int[] query: queries) {ans.add(isPre[query[0]][query[1]]);}return ans;}
}

解法2——Floyd算法判断是否存在路径

关于Floyd算法可见:【算法基础:搜索与图论】3.4 求最短路算法(Dijkstra&bellman-ford&spfa&Floyd)

class Solution {public List<Boolean> checkIfPrerequisite(int numCourses, int[][] prerequisites, int[][] queries) {boolean[][] g = new boolean[numCourses][numCourses];for (int[] p: prerequisites) {g[p[0]][p[1]] = true;}// Floyd三重循环for (int k = 0; k < numCourses; ++k) {for (int i = 0; i < numCourses; ++i) {for (int j = 0; j < numCourses; ++j) {g[i][j] = g[i][j] | (g[i][k] & g[k][j]);}}}// 回复查询List<Boolean> ans = new ArrayList<>();for (int[] q: queries) {ans.add(g[q[0]][q[1]]);}return ans;}
}

2596. 检查骑士巡视方案(方向模拟)

https://leetcode.cn/problems/check-knight-tour-configuration/?envType=daily-question&envId=2023-09-13

在这里插入图片描述
提示:
n == grid.length == grid[i].length
3 <= n <= 7
0 <= grid[row][col] < n * n
grid 中的所有整数 互不相同

按题意模拟八个方向即可。

class Solution {int[] dx = {-1, -2, -2, -1, 1, 2, 2, 1}, dy = new int[]{-2, -1, 1, 2, 2, 1, -1, -2};public boolean checkValidGrid(int[][] grid) {int n = grid.length;int x = 0, y = 0;for (int i = 0; i < n * n - 1; ++i) {   // 检查每一步boolean f = false;for (int k = 0; k < 8; ++k) {       // 尝试8个方向int nx = x + dx[k], ny = y + dy[k];if (nx >= 0 && ny >= 0 && nx < n && ny < n && grid[nx][ny] == grid[x][y] + 1) {x = nx;y = ny;f = true;break;}}if (!f) return false;}return true;}
}

1222. 可以攻击国王的皇后(方向模拟)

https://leetcode.cn/problems/queens-that-can-attack-the-king/description/

在这里插入图片描述
在这里插入图片描述
提示:

1 <= queens.length <= 63
queens[i].length == 2
0 <= queens[i][j] < 8
king.length == 2
0 <= king[0], king[1] < 8
一个棋盘格上最多只能放置一枚棋子。

将所有皇后放入一个哈希集合中。

从国王位置开始,枚举8个方向,走8步,如果遇到的位置存在于皇后集合中,则将其加入答案。

class Solution {public List<List<Integer>> queensAttacktheKing(int[][] queens, int[] king) {List<List<Integer>> ans = new ArrayList<>();Set<Integer> s = new HashSet<>();for (int[] q: queens) s.add(q[0] * 10 + q[1]);int[] dx = {-1, -1, 0, 1, 1, 1, 0, -1}, dy = {0, 1, 1, 1, 0, -1, -1, -1};int x = king[0], y = king[1];for (int i = 0; i < 8; ++i) {           // 枚举8个方向for (int k = 1; k < 8; ++k) {       // 枚举8步int nx = x + dx[i] * k, ny = y + dy[i] * k;if (nx >= 0 && ny >= 0 && nx < 8 && ny < 8) {if (s.contains(nx * 10 + ny)) {ans.add(List.of(nx, ny));break;}} else break;}}return ans;}
}

LCP 50. 宝石补给(简单模拟)

https://leetcode.cn/problems/WHnhjV/?envType=daily-question&envId=2023-09-15
在这里插入图片描述

提示:
2 <= gem.length <= 10^3
0 <= gem[i] <= 10^3
0 <= operations.length <= 10^4
operations[i].length == 2
0 <= operations[i][0], operations[i][1] < gem.length

按照题意模拟即可,注意向下取整的用法。

class Solution {public int giveGem(int[] gem, int[][] operations) {// 模拟for (int[] op: operations) {gem[op[1]] += gem[op[0]] / 2;gem[op[0]] = (gem[op[0]] + 1) / 2;}int mn = gem[0], mx = gem[0];for (int g: gem) {mn = Math.min(mn, g);mx = Math.max(mx, g);}return mx - mn;}
}

198. 打家劫舍(经典线性DP)

https://leetcode.cn/problems/house-robber/?envType=daily-question&envId=2023-09-16
在这里插入图片描述
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 400

经典线性规划嘛——
要么偷当前位置,要么不偷当前位置,取两者最大的。

class Solution {public int rob(int[] nums) {int n = nums.length;if (n == 1) return nums[0];int[] dp = new int[n];dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < n; ++i) dp[i] = Math.max(dp[i - 1], nums[i] + dp[i - 2]);return dp[n - 1];}
}

213. 打家劫舍 II(循环打家劫舍)

https://leetcode.cn/problems/house-robber-ii/description/?envType=daily-question&envId=2023-09-17
在这里插入图片描述

提示:
1 <= nums.length <= 100
0 <= nums[i] <= 1000

代码写法1——另写方法robR(l, r)

class Solution {public int rob(int[] nums) {int n = nums.length;if (n == 1) return nums[0];return Math.max(robR(nums, 0, n - 2), robR(nums, 1, n - 1));}public int robR(int[] nums, int l, int r) {if (l == r) return nums[l];int[] dp = new int[r - l + 1];dp[0] = nums[l];dp[1] = Math.max(dp[0], nums[l + 1]);for (int i = l + 2; i <= r; ++i) {dp[i - l] = Math.max(dp[i - 1 - l], dp[i - 2 - l] + nums[i]);}return dp[r - l];}
}

代码写法2——二维dp数组

class Solution {public int rob(int[] nums) {int n = nums.length;if (n == 1) return nums[0];int[] dp1 = new int[n], dp2 = new int[n];dp1[0] = nums[0];dp1[1] = Math.max(nums[0], nums[1]);dp2[1] = nums[1];for (int i = 2; i < n; ++i) {dp1[i] = Math.max(dp1[i - 1], dp1[i - 2] + nums[i]);dp2[i] = Math.max(dp2[i - 1], dp2[i - 2] + nums[i]);}return Math.max(dp1[n - 2], dp2[n - 1]);}
}

两种写法见仁见智吧。

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

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

相关文章

Leetcode 106. 从中序与后序遍历序列构造二叉树

文章目录 题目代码&#xff08;9.18 首刷自解&#xff09; 题目 Leetcode 106. 从中序与后序遍历序列构造二叉树 代码&#xff08;9.18 首刷自解&#xff09; class Solution { public:unordered_map<int, int> val2Index;TreeNode* buildTree(vector<int>& …

C++运算符优先级一览表

VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…

开发需知的文件加密与解密

背景 最近团队遇到一个小需求&#xff0c;存在两个系统 A、B&#xff0c;系统 A 支持用户在线制作皮肤包&#xff0c;制作后的皮肤包用户可以下载后&#xff0c;导入到另外的系统 B 上。皮肤包本身的其实就是一个 zip 压缩包&#xff0c;系统 B 接收到压缩包后&#xff0c;解压…

dvwa靶场通关(十二)

第十二关&#xff1a;Stored Cross Site Scripting (XSS)&#xff08;存储型xss&#xff09; low 这一关没有任何防护&#xff0c;直接输入弹窗代码 弹窗成功 medium 先试试上面的代码看看&#xff0c;有没有什么防护 发现我们的script标签不见了&#xff0c;应该是被过滤掉…

跑腿系统开发:构建实时任务分配算法的技术挑战

在跑腿系统中&#xff0c;实时任务分配算法是确保任务快速高效完成的关键因素之一。本文将介绍构建实时任务分配算法时可能面临的技术挑战&#xff0c;并提供一个简单的Python示例来解决这些挑战。 技术挑战&#xff1a; 实时数据处理&#xff1a; 跑腿系统需要处理大量的实时任…

Windows Server 2008安装.NET Framework 3.5

安装.NET Framework 3.5一、打开服务器管理器 在开始菜单中搜索“服务器管理器” 二、添加.NET Framework 3.5.1功能 &#xff08;一&#xff09;功能-》添加功能 &#xff08;二&#xff09;选择功能“.NET Framework 3.51” 1.点击“NET Framework 3.5.1”勾选框 2.点击“添…

C#小知识

项目编译后复制文件到生成目录 方法1 对于单个文件&#xff0c;可以点击属性。输出目录里选择始终复制。 方法2 把项目中的ServerScripts复制到输出目录。 在项目设置中&#xff0c;生成事件里添加批处理 xcopy $(ProjectDir)ServerScripts\*.* $(TargetDir)ServerScrip…

本地搭建CFimagehost私人图床——“cpolar内网穿透”

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

【JVM】Java类的加载机制!

一、类的生命周期 类加载过程包含&#xff1a;加载、验证、准备、解析和初始化 &#xff0c;一共包括5 个阶段。 &#xff08;1&#xff09;加载&#xff1a; 简单来说就是将java类的字节码文件加载到机器内存中。在加载类时&#xff0c;Java虚拟机必须完成以下3件事情&…

[Linux打怪升级之路]-缓冲区

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习目标&…

AI助力安全监管:TSINGSEE视频智能分析系统烟火识别算法

水火无情人有情&#xff0c;火灾一旦发生没有被及时发现&#xff0c;就能在极短的时间内酿成无法挽回的大祸&#xff0c;所以烟火的监管与处理极为重要。为了让火患在刚发生时就能得到扼制&#xff0c;TSINGSEE青犀AI智能分析网关烟火识别算法具有重要意义。 TSINGSEE青犀AI智能…

Arcgis栅格转点时ERROR 999999: 执行函数时出错。 无法创建要素数据集。 执行(RasterToPoint)失败

Arcgis栅格转点时ERROR 999999: 执行函数时出错。 无法创建要素数据集。 执行(RasterToPoint)失败。 问题描述 原因 输出点要素的位置不对 解决方案 点击新建文件地理数据库 然后在该文件地理数据库下输出

.Net IDE智能提示汉化(.Net6、AspNetCore)

先上现成的.net6汉化文件&#xff0c;可以手动下载后参照 如何为 .NET 安装本地化的 IntelliSense 文件 进行安装。或者使用后文的工具进行自动安装。 无对照英文在前中文在前 汉化内容来自 官方在线文档 &#xff0c;某些内容可能存在明显的机翻痕迹。 上一些效果图&#x…

UINT64整型数据在格式化时使用了不匹配的格式化符%d导致其他参数无法打印的问题排查

目录 1、问题描述 2、格式化函数内部解析待格式化参数的完整机制说明 2.1、传递给被调用函数的参数是通过栈传递的 2.2、格式化函数是如何从栈上找到待格式化的参数值&#xff0c;并完成格式化的&#xff1f; 2.3、字符串格式化符%s对应的异常问题场景说明 2.4、为了方便…

项目实战— pytorch搭建CNN处理MNIST数据集

项目文件夹介绍 项目文件夹 CNN_MNIST_practice文件夹是整个项目的文件夹&#xff0c;里面存放了六个子文件夹以及四个 .py 程序&#xff0c;接下来我们分别来介绍这些文件的内容。 其中 minist_all_CPU.py 是CPU版本的模型训练&#xff0b;测试程序&#xff0c;而 min…

【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署

【Redis】Redis常见面试题&#xff08;3&#xff09; 文章目录 【Redis】Redis常见面试题&#xff08;3&#xff09;1. 特性&应用场景1.1 Redis能实现什么功能1.2 Redis支持分布式的原理1.3 为什么Redis这么快1.4 Redis实现分布式锁1.5 Redis作为缓存 2. 数据类型2.1 Redis…

03MyBatis-Plus中的常用注解

常用注解 TableName MyBatis-Plus根据BaseMapper中指定的泛型(实体类型名)确定数据库中操作的表,如果根据实体类型名找不到数据库中对应的表则会报表不存在异常 //向表中插入一条数据 Test public void testInsert(){User user new User(null, "张三", 23, "…

Python编辑器和Pycharm的傻瓜式安装部署

给我家憨憨写的python教程 有惊喜等你找噢 ——雁丘 Python解释器Pycharm的安装部署 关于本专栏一 Python编辑器1.1 使用命令提示符编写Python程序1.2 用记事本编写Python程序 二 Pycharm的安装三 Pycharm的部署四 Pycharm基础使用技巧4.1 修改主题颜色4.2 修改字体4.3 快速修…

mysql中update更新时加条件和不加条件速度对比

测试时有时需要执行更新操作&#xff0c;想知道大量数据update时加where条件和不加where条件速度差异如何&#xff0c;正好有条件测试&#xff0c;记录一下。 数据&#xff1a;9张表&#xff0c;每张表300w条数据 一、对9张表进行单字段更新时不加条件(如&#xff1a;update …

【UE虚幻引擎】UE源码版编译、Andorid配置、打包

首先是要下载源码版的UE&#xff0c;我这里下载的是5.2.1 首先要安装Git 在你准备放代码的文件夹下右键点击Git Bash Here 然后可以直接git clone https://github.com/EpicGames/UnrealEngine 不行的话可以直接去官方的Github上下载Zip压缩包后解压 运行里面的Setup.bat&a…