当前位置: 首页 > news >正文

【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——二分答案补充&#xff1a;求一个int数组的和&#xff0c;但数组和会超int 解法2——贪心解法 2251. 花期内花的数目解法1——二分答案代码1——朴素二分写法代码2——精简二分⭐ 解法2——差分⭐⭐⭐ 2258. 逃离火灾解法1—…...

vuejs如何将线上PDF转为base64编码

只需要两个方法-下载与转换&#xff1a; 下载方法&#xff1a; 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之前&#xff0c;我们先做以下的实验&#xff0c;新建一个文件&#xff0c;输入以下代码 total_sum 0 for x in range(1,101):total_sum x print(total_sum)非常非常简单的一个程序&#xff0c;主要就是计算1加到100的值&#xff0c;我们将它重命名…...

【lambda函数】lambda()函数

lambda&#xff08;&#xff09; lambda&#xff08;&#xff09;语法捕捉列表mutable lambda 底层原理函数对象与lambda表达式 lambda&#xff08;&#xff09;语法 lambda表达式书写格式&#xff1a; [capture-list] (parameters) mutable -> return-type{ statement }咱…...

ThreeJs CSS3DObject 点击失效问题

想实现一个在选中物体&#xff0c;弹出菜单&#xff0c;结果发现&#xff0c;点击会失效 <ul id"menu" class"list-group list-group-full"><li class"list-group-item" onclick"test()">24小时曲线</li><li cla…...

飞书深诺、恒生面试(部分)(未完全解析)

飞书深诺 说一下你对SaaS项目的理解&#xff1f;数据隔离是怎么处理的&#xff1f;Answer: 我们采用的是SAAS服务多租户数据隔离架构中的1.3共享数据库&#xff0c;通过租户ID来隔离&#xff0c;成本最低&#xff0c;隔离级别最低。Q&#xff1a;有没有开发隔离的中间件&#x…...

Spring Cloud Config: 了解、原理和使用

Spring Cloud Config: 了解、原理和使用 Spring Cloud Config 是 Spring Cloud 生态系统中的一个重要组件&#xff0c;它提供了一种分布式配置管理的解决方案&#xff0c;能够集中管理应用程序的配置&#xff0c;支持多种后端存储&#xff0c;如 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万条记录&#xff0c;现在要执行这样一个查询&#xff1a;SELECT * FROM table where num10000。如果没有索引&#xff0c;必须遍历整个表&#xff0c;直到num等于10000的这一行被找到为止&#xff1b;如果在num列上创建索引&#xff0c;SQL …...

java抽奖

目录 一、简要描述 二、代码 一、简要描述 此抽奖方式为&#xff1a;在1~30个数字之间 挑选7个不重复的数字输入&#xff0c;系统会根据中奖的号码与用户输入的号码进行比较&#xff0c;系统会输出是否中奖的提示&#xff01; 二、代码 import java.util.Scanner; import ja…...

【springboot+云计算】B/S医院信息管理系统源码(云HIS)

一、基于云计算技术的B/S架构的医院管理系统(简称云HIS) 采用前后端分离架构&#xff0c;前端由Angular框架、JavaScript语言开发&#xff1b;后端使用Java语言开发。系统遵循服务化、模块化原则开发&#xff0c;具有强大的可扩展性&#xff0c;二次开发方便快捷。为医疗机构提…...

go 读写 excel 读取 txt 繁体中文转码

读取txt&#xff0c;繁体中文转码 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是一个开源的交互式笔记本环境&#xff0c;可以用于编写和执行代码、创建可视化效果、展示数据分析结果等。我们在这里用它实现代码运行和观察运行结果。安装jupyter notebook实质上是安装Anaconda,后续还要在Anaconda Prompt中使用c…...

Django实现简单的音乐播放器 2

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

OpenCV 入门教程:图像读取和显示

OpenCV 入门教程&#xff1a;图像读取和显示 导语一、图像读取1.1、导入 OpenCV 库1.2、读取图像文件1.3、图像读取的返回值 二、图像显示2.1、创建窗口2.2、图像显示2.3、等待按键2.4、关闭窗口 三、示例应用总结 导语 在计算机视觉和图像处理领域&#xff0c;读取和显示图像…...

什么是GPT?

文章目录 1、什么是GPT&#xff1f;2、gpt版本时间线3、我们能用GPT做什么&#xff1f;4、如何快速体验GPT&#xff1f;5、作为一名开发者&#xff0c;如何在代码中使用GPT&#xff1f;6、如何在现有项目中使用和部署GPT&#xff1f;7、GPT的优缺点&#xff1f;8、对于人工智能…...

如何通过浏览器配置哪些网页不走代理服务器,Lantern开启后部分网页打不开了

浏览器点设置 > 搜索“代理” > “打开计算机的代理设置” > 编辑“使用代理服务器” 搜索“代理” > “打开计算机的代理设置” > 编辑“使用代理服务器”&#xff0c;将不用代理的url链接域名写进来&#xff0c;点击保存。然后刷新打不开的网页&#xff0c;…...

Redis常见面试题

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

手把手教你配置Davinci NvM Block:从Fee关联到Dataset索引的保姆级避坑指南

手把手教你配置Davinci NvM Block&#xff1a;从Fee关联到Dataset索引的保姆级避坑指南 在汽车电子软件开发中&#xff0c;非易失性存储管理&#xff08;NvM&#xff09;是确保关键数据持久化的核心模块。Davinci配置工具作为AUTOSAR开发环境的重要组成部分&#xff0c;其NvM B…...

nuScenes数据集深度解析:从传感器融合到3D目标检测的完整数据流

nuScenes数据集工程化实战&#xff1a;多传感器时空对齐与3D检测数据流优化 在自动驾驶研发领域&#xff0c;数据是算法迭代的基石。当我们谈论nuScenes数据集时&#xff0c;多数讨论停留在基础功能介绍层面&#xff0c;却鲜有从工程实现角度剖析其数据流设计的精妙之处。本文将…...

AI的正规方程法与梯度下降法的比较研究

...

从格式枷锁到自由播放:ncmdumpGUI的NCM解码技术突围

从格式枷锁到自由播放&#xff1a;ncmdumpGUI的NCM解码技术突围 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 当你花费数小时精心收藏的音乐专辑在智能音箱上…...

Blender 3MF插件全攻略:提升3D打印工作流效率的关键技术

Blender 3MF插件全攻略&#xff1a;提升3D打印工作流效率的关键技术 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 3MF格式作为3D打印领域的核心交换标准&#xff0c;正…...

Windows/Linux双平台实战:用Docker快速部署MySQL 5.7.36并导入数据

跨平台Docker实战&#xff1a;MySQL 5.7.36高效部署与数据迁移指南 在混合开发环境中&#xff0c;数据库的快速部署与迁移往往是影响团队协作效率的关键因素。想象一下这样的场景&#xff1a;一位开发者刚在Windows笔记本上完成本地测试&#xff0c;需要将包含复杂表结构的MySQ…...

构建语音驱动的智能Agent:集成SenseVoice-Small与AI决策框架

构建语音驱动的智能Agent&#xff1a;集成SenseVoice-Small与AI决策框架 你有没有想过&#xff0c;对着电脑说句话&#xff0c;它就能帮你写代码、查资料、甚至控制智能家居&#xff1f;这听起来像是科幻电影里的场景&#xff0c;但现在&#xff0c;通过将强大的语音识别模型与…...

PostgreSQL实战:使用pg_dump精准导出特定模式下的表结构

1. 为什么需要精准导出特定模式下的表结构 在实际的数据库管理工作中&#xff0c;我们经常会遇到只需要导出特定模式&#xff08;schema&#xff09;下表结构的需求。比如在微服务架构中&#xff0c;每个服务可能对应数据库中的一个模式&#xff1b;或者在进行数据库迁移时&…...

结合AI改写技术与五个技巧,快速优化论文查重率至合格范围

嘿&#xff0c;大家好&#xff01;我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题&#xff1a;论文重复率飙到30%以上怎么办&#xff1f;别慌&#xff0c;我这就分享5个实用降重技巧&#xff0c;帮你一次搞定&#xff0c;轻松压到合格线以下。这些方法都是我亲身试验过的&a…...

别再让UI卡死了!WPF开发中Dispatcher.Invoke和BeginInvoke的保姆级避坑指南

别再让UI卡死了&#xff01;WPF开发中Dispatcher.Invoke和BeginInvoke的保姆级避坑指南 当你在WPF应用中点击一个按钮后界面突然冻结&#xff0c;进度条卡在50%不再前进&#xff0c;鼠标变成旋转的沙漏——这种糟糕的用户体验往往源于错误的线程调度方式。作为C#开发者&#xf…...