【LeetCode周赛】2022上半年题目精选集——二分
文章目录
- 2141. 同时运行 N 台电脑的最长时间
- 解法1——二分答案
- 补充:求一个int数组的和,但数组和会超int
- 解法2——贪心解法
- 2251. 花期内花的数目
- 解法1——二分答案
- 代码1——朴素二分写法
- 代码2——精简二分⭐
- 解法2——差分⭐⭐⭐
- 2258. 逃离火灾
- 解法1——两次bfs
- 解法2——二分 + BFS
2141. 同时运行 N 台电脑的最长时间
2141. 同时运行 N 台电脑的最长时间
提示:
1 <= n <= batteries.length <= 10^5
1 <= batteries[i] <= 10^9
解法1——二分答案
二分答案。
解释见:【LeetCode周赛】2022上半年题目精选集——贪心
class Solution {public long maxRunTime(int n, int[] batteries) {// long sum = Arrays.stream(batteries).asLongStream().sum();long sum = Arrays.stream(batteries).mapToLong(Long::valueOf).sum();long l = 0, r = sum / n;while (l < r) {long mid = l + r + 1 >> 1;if (check(n, batteries, mid)) l = mid;else r = mid - 1;}return l;}public boolean check(int n, int[] batteries, long k) {long sum = 0;for (int battery: batteries) sum += Math.min(k, battery);return n <= sum / k;}
}
补充:求一个int数组的和,但数组和会超int
解法——将 int 转成 long
写法1:
long sum = Arrays.stream(batteries).asLongStream().sum();
写法2:
long sum = Arrays.stream(batteries).mapToLong(Long::valueOf).sum();
解法2——贪心解法
见:【LeetCode周赛】2022上半年题目精选集——贪心
2251. 花期内花的数目
2251. 花期内花的数目
解法1——二分答案
枚举每个人。
每个人看到花的数量,通过二分法得出,等于 start <= time 且 end >= time 的花的数量,可以通过 start <= time 减去 end < time 的数量得到每个人的答案。
(即从一个合理的范围内减去不合理的那部分)。
代码1——朴素二分写法
(其实就是笔者自己写的代码)
class Solution {public int[] fullBloomFlowers(int[][] flowers, int[] people) {int m = flowers.length, n = people.length;int[] ans = new int[n];int[] start = new int[m], end = new int[m];for (int i = 0; i < m; ++i) {start[i] = flowers[i][0];end[i] = flowers[i][1];}Arrays.sort(start);Arrays.sort(end);for (int i = 0; i < n; ++i) {ans[i] = op(start, end, people[i]);}return ans;}public int op(int[] start, int[] end, int time) {int n = start.length;if (start[0] > time || end[n - 1] < time) return 0;// 找到最后一个开花时间<=time的花int l = 0, r = n - 1; while (l < r) {int mid = l + r + 1 >> 1;if (start[mid] > time) r = mid - 1;else l = mid;}int x = l;// 找到第一个结束时间>=time的花l = 0;r = n - 1;while (l < r) {int mid = l + r >> 1;if (end[mid] < time) l = mid + 1;else r = mid;}// 在开花时间<=time的花中减去结束时间<time的花就是答案return x - l + 1;}
}
代码2——精简二分⭐
计算 x = start 中 >= p + 1 的下标, y = end 中 >= p 的下标。
结果为 x - y。
class Solution {public int[] fullBloomFlowers(int[][] flowers, int[] persons) {int[] starts = Arrays.stream(flowers).mapToInt(f -> f[0]).sorted().toArray();int[] ends = Arrays.stream(flowers).mapToInt(f -> f[1]).sorted().toArray();return Arrays.stream(persons).map(p -> lowerBound(starts, p + 1) - lowerBound(ends, p)).toArray();}// 找到第一个>=x的值,即x的下界int lowerBound(int[] arr, int x) {int left = 0, right = arr.length; // 注意r的初始值是n而不是n-1while (left < right) {int mid = (left + right) >>> 1;if (arr[mid] >= x) right = mid;else left = mid + 1;}return left;}
}
这种方法通过 lowerBound() 方法避免了写两次二分。
解法2——差分⭐⭐⭐
由于数据范围的原因,我们需要使用 map 而不是数组来存储 差分结果。
关于差分可见:【算法基础】1.5 前缀和与差分
class Solution {public int[] fullBloomFlowers(int[][] flowers, int[] people) {Map<Integer, Integer> diff = new HashMap();for (int[] flower: flowers) {diff.merge(flower[0], 1, Integer::sum);diff.merge(flower[1] + 1, -1, Integer::sum);}// 去除差分哈希表中的所有时间点int[] times = diff.keySet().stream().mapToInt(Integer::intValue).sorted().toArray();int n = people.length;Integer[] ids = IntStream.range(0, n).boxed().toArray(Integer[]::new);Arrays.sort(ids, (i, j) -> people[i] - people[j]); // 按时间升序取出people数组下标int[] ans = new int[n];int i = 0, sum = 0;for (int id: ids) {while (i < times.length && times[i] <= people[id]) {sum += diff.get(times[i++]);}ans[id] = sum;}return ans;}
}
2258. 逃离火灾
2258. 逃离火灾
难度:2347
解法1——两次bfs
先对火焰进行多源 bfs ,计算出火焰达到每个位置的时间。
然后对人进行 bfs,记录每条路径上最多能等待多少时间,每条路径达到终点时更新答案。
class Solution {public int maximumMinutes(int[][] grid) {int[] dx = {-1, 0, 1, 0}, dy = {0, -1, 0, 1};// 先处理出火达到每个地方的时间,如果达到不了,设置成最大值int m = grid.length, n = grid[0].length;int[][] times = new int[m][n];Queue<int[]> q = new LinkedList();for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] != 1) {times[i][j] = Integer.MAX_VALUE; // 表示火还没有到} else {q.offer(new int[]{i, j}); // 加入当前有火的队列 times[i][j] = 1;}}}// 计算火焰达到每个位置的时间int t = 2;while (!q.isEmpty()) {int sz = q.size();for (int i = 0; i < sz; ++i) {int[] cur = q.poll();int x = cur[0], y = cur[1];for (int k = 0; k < 4; ++k) {int nx = x + dx[k], ny = y + dy[k];if (nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] == 0) {grid[nx][ny] = 1;times[nx][ny] = t;q.offer(new int[]{nx, ny});}}}t++;}// bfs 人int ans = -1;t = 2;grid[0][0] = 2;q.offer(new int[]{0, 0, times[0][0] - 1}); // 最后一个元素记录当前时间的冗余while (!q.isEmpty()) {int sz = q.size();for (int i = 0; i < sz; ++i) {int[] cur = q.poll();int x = cur[0], y = cur[1], curLeftTime = cur[2];for (int k = 0; k < 4; ++k) {int nx = x + dx[k], ny = y + dy[k];if (nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] != 2) {// 把走过的地方标记成墙壁,但是终点可以以不同方式到达多次if (nx != m - 1 || ny != n - 1) grid[nx][ny] = 2; int leftTime;// 如果到了终点就不用考虑当前时刻被火追上if (nx == m - 1 && ny == n - 1) leftTime = Math.min(curLeftTime, times[nx][ny] - t);else leftTime = Math.min(curLeftTime, times[nx][ny] - t - 1);if (leftTime < 0) continue; // 时间不够这条路走不通if (nx == m - 1 && ny == n - 1) ans = Math.max(ans, leftTime);q.offer(new int[]{nx, ny, leftTime});}}}t++;}return ans > m * n? (int)1e9: ans;}
}
解法2——二分 + BFS
https://leetcode.cn/problems/escape-the-spreading-fire/solution/er-fen-bfspythonjavacgo-by-endlesscheng-ypp1/
注意
!:实际上笔者认为这道题目是不需要二分的,使用二分反倒时间复杂度上去了。
class Solution {static int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int maximumMinutes(int[][] grid) {int m = grid.length, n = grid[0].length;int left = -1, right = m * n;while (left < right) {var mid = (left + right + 1) / 2;if (check(grid, mid)) left = mid;else right = mid - 1;}return left < m * n ? left : (int) 1e9;}boolean check(int[][] grid, int t) {int m = grid.length, n = grid[0].length;var fire = new boolean[m][n];var f = new ArrayList<int[]>();for (var i = 0; i < m; i++)for (var j = 0; j < n; j++)if (grid[i][j] == 1) {fire[i][j] = true;f.add(new int[]{i, j});}while (t-- > 0 && f.size() > 0)f = spreadFire(grid, fire, f); // 蔓延至多 t 分钟的火势if (fire[0][0]) return false; // 起点着火,寄var vis = new boolean[m][n];vis[0][0] = true;var q = new ArrayList<int[]>();q.add(new int[]{0, 0});while (q.size() > 0) {var tmp = q;q = new ArrayList<>();for (var p : tmp)if (!fire[p[0]][p[1]])for (var d : dirs) {int x = p[0] + d[0], y = p[1] + d[1];if (0 <= x && x < m && 0 <= y && y < n && !fire[x][y] && !vis[x][y] && grid[x][y] == 0) {if (x == m - 1 && y == n - 1) return true; // 我们安全了…暂时。vis[x][y] = true;q.add(new int[]{x, y});}}f = spreadFire(grid, fire, f); // 蔓延 1 分钟的火势}return false; // 寄}ArrayList<int[]> spreadFire(int[][] grid, boolean[][] fire, ArrayList<int[]> f) {int m = grid.length, n = grid[0].length;var tmp = f;f = new ArrayList<>();for (var p : tmp)for (var d : dirs) {int x = p[0] + d[0], y = p[1] + d[1];if (0 <= x && x < m && 0 <= y && y < n && !fire[x][y] && grid[x][y] == 0) {fire[x][y] = true;f.add(new int[]{x, y});}}return f;}
}
仅作了解即可。
相关文章:

【LeetCode周赛】2022上半年题目精选集——二分
文章目录 2141. 同时运行 N 台电脑的最长时间解法1——二分答案补充:求一个int数组的和,但数组和会超int 解法2——贪心解法 2251. 花期内花的数目解法1——二分答案代码1——朴素二分写法代码2——精简二分⭐ 解法2——差分⭐⭐⭐ 2258. 逃离火灾解法1—…...
vuejs如何将线上PDF转为base64编码
只需要两个方法-下载与转换: 下载方法: demoDownloadPDF(url) {// if (!(/^https?:/i.test(url))) return;if (window.XMLHttpRequest) var xhr new XMLHttpRequest(); else var xhr new ActiveXObject("MSXML2.XMLHTTP");xhr.open(GET, u…...
Repo工作原理及常用命令总结——2023.07
文章目录 1. 概要2. 工作原理2.1 项目清单库(.repo/manifests)2.2 repo脚本库(.repo/repo)2.3 仓库目录和工作目录2.4 repo 目录结构分析 3. 使用介绍3.1 init3.2 sync3.3 upload3.4 download3.5 forall3.6 prune3.7 start3.8 status 4. 使用实践4.1 对项目清单文件进行定制4.2…...

Python教程(2)——开发python常用的IDE
为什么需要IDE 在理解IDE之前,我们先做以下的实验,新建一个文件,输入以下代码 total_sum 0 for x in range(1,101):total_sum x print(total_sum)非常非常简单的一个程序,主要就是计算1加到100的值,我们将它重命名…...

【lambda函数】lambda()函数
lambda() lambda()语法捕捉列表mutable lambda 底层原理函数对象与lambda表达式 lambda()语法 lambda表达式书写格式: [capture-list] (parameters) mutable -> return-type{ statement }咱…...
ThreeJs CSS3DObject 点击失效问题
想实现一个在选中物体,弹出菜单,结果发现,点击会失效 <ul id"menu" class"list-group list-group-full"><li class"list-group-item" onclick"test()">24小时曲线</li><li cla…...

飞书深诺、恒生面试(部分)(未完全解析)
飞书深诺 说一下你对SaaS项目的理解?数据隔离是怎么处理的?Answer: 我们采用的是SAAS服务多租户数据隔离架构中的1.3共享数据库,通过租户ID来隔离,成本最低,隔离级别最低。Q:有没有开发隔离的中间件&#x…...

Spring Cloud Config: 了解、原理和使用
Spring Cloud Config: 了解、原理和使用 Spring Cloud Config 是 Spring Cloud 生态系统中的一个重要组件,它提供了一种分布式配置管理的解决方案,能够集中管理应用程序的配置,支持多种后端存储,如 Git、SVN、本地文件系统、Vaul…...

基于图的路径规划算法对比
基于图的路径规划算法对比 算法说明与实现效果构造路网1.打开Arcmap2.新建Shapefile文件3.编辑Shapefile属性4.开始编辑5.创建要素并绘制路网6.打断相交线7.保存编辑8.打开图层属性表9.添加字段10.完成字段添加11.计算字段id12.计算点线字段13.选中length字段14.计算length字段…...
SQL Server 索引
1、索引的概念 假设数据库中现在有2万条记录,现在要执行这样一个查询:SELECT * FROM table where num10000。如果没有索引,必须遍历整个表,直到num等于10000的这一行被找到为止;如果在num列上创建索引,SQL …...
java抽奖
目录 一、简要描述 二、代码 一、简要描述 此抽奖方式为:在1~30个数字之间 挑选7个不重复的数字输入,系统会根据中奖的号码与用户输入的号码进行比较,系统会输出是否中奖的提示! 二、代码 import java.util.Scanner; import ja…...

【springboot+云计算】B/S医院信息管理系统源码(云HIS)
一、基于云计算技术的B/S架构的医院管理系统(简称云HIS) 采用前后端分离架构,前端由Angular框架、JavaScript语言开发;后端使用Java语言开发。系统遵循服务化、模块化原则开发,具有强大的可扩展性,二次开发方便快捷。为医疗机构提…...
go 读写 excel 读取 txt 繁体中文转码
读取txt,繁体中文转码 package mainimport ("bufio""fmt""golang.org/x/text/encoding/traditionalchinese""os" )func readTxtTest() {txtPath : C:\Users\admin\Desktop\contact.txtfile, err : os.Open(txtPath)if err…...
docker网卡的IP地址修改
1. 安装docker 请参考 Linux系统在线安装docker任意版本完整教程 2. dockers启动一个容器查看容器ip docker run -d --name nginx -p 80:80 nginx #启动一个容器 docker ps -a #查看容器正常运行 docker inspect --format {{ .NetworkSettings.IPAddress }} nginx ##查看…...

python与深度学习——基础环境搭建
一、安装jupyter notebook Jupyter Notebook是一个开源的交互式笔记本环境,可以用于编写和执行代码、创建可视化效果、展示数据分析结果等。我们在这里用它实现代码运行和观察运行结果。安装jupyter notebook实质上是安装Anaconda,后续还要在Anaconda Prompt中使用c…...

Django实现简单的音乐播放器 2
在《Django实现简单的音乐播放器 1》前期准备的基础上开始开发。 效果: 目录 项目视图 创建视图方法 路由加载视图 加载模板 创建首页html文件 加载静态资源文件 加载静态文件 使用方法 启动服务器 加载数据表 创建表模型 生成表迁移 执行创建表 插入…...

OpenCV 入门教程:图像读取和显示
OpenCV 入门教程:图像读取和显示 导语一、图像读取1.1、导入 OpenCV 库1.2、读取图像文件1.3、图像读取的返回值 二、图像显示2.1、创建窗口2.2、图像显示2.3、等待按键2.4、关闭窗口 三、示例应用总结 导语 在计算机视觉和图像处理领域,读取和显示图像…...
什么是GPT?
文章目录 1、什么是GPT?2、gpt版本时间线3、我们能用GPT做什么?4、如何快速体验GPT?5、作为一名开发者,如何在代码中使用GPT?6、如何在现有项目中使用和部署GPT?7、GPT的优缺点?8、对于人工智能…...

如何通过浏览器配置哪些网页不走代理服务器,Lantern开启后部分网页打不开了
浏览器点设置 > 搜索“代理” > “打开计算机的代理设置” > 编辑“使用代理服务器” 搜索“代理” > “打开计算机的代理设置” > 编辑“使用代理服务器”,将不用代理的url链接域名写进来,点击保存。然后刷新打不开的网页,…...

Redis常见面试题
什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么 把redis内存中的数据持久化到磁盘的过程就是redis持久化。RDB:快照存储,每隔一段时间对redis内存中的数据进程快照存储。优点:恢复数据快 缺点:数据完整性差 AOF:日志追加 把每个写…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...