周赛334(前缀和、贪心+双指针、Dijkstra求最短路径、二分答案)
文章目录
- [6369. 左右元素和的差值](https://leetcode.cn/problems/left-and-right-sum-differences/)
- 前缀和
- [6368. 找出字符串的可整除数组](https://leetcode.cn/problems/find-the-divisibility-array-of-a-string/)
- 超长整数如何取余?
- [6367. 求出最多标记下标](https://leetcode.cn/problems/find-the-maximum-number-of-marked-indices/)
- 贪心 + 同向双指针
- 二分答案
- [6366. 在网格图中访问一个格子的最少时间](https://leetcode.cn/problems/minimum-time-to-visit-a-cell-in-a-grid/)
- Dijkstra求最短路径
- 二分答案
6369. 左右元素和的差值
难度简单4
给你一个下标从 0 开始的整数数组 nums ,请你找出一个下标从 0 开始的整数数组 answer ,其中:
answer.length == nums.lengthanswer[i] = |leftSum[i] - rightSum[i]|
其中:
leftSum[i]是数组nums中下标i左侧元素之和。如果不存在对应的元素,leftSum[i] = 0。rightSum[i]是数组nums中下标i右侧元素之和。如果不存在对应的元素,rightSum[i] = 0。
返回数组 answer 。
示例 1:
输入:nums = [10,4,8,3]
输出:[15,1,11,22]
解释:数组 leftSum 为 [0,10,14,22] 且数组 rightSum 为 [15,11,3,0] 。
数组 answer 为 [|0 - 15|,|10 - 11|,|14 - 3|,|22 - 0|] = [15,1,11,22] 。
示例 2:
输入:nums = [1]
输出:[0]
解释:数组 leftSum 为 [0] 且数组 rightSum 为 [0] 。
数组 answer 为 [|0 - 0|] = [0] 。
提示:
1 <= nums.length <= 10001 <= nums[i] <= 105
前缀和
class Solution {public int[] leftRigthDifference(int[] nums) {int n = nums.length;int[] leftsum = new int[n+1];int[] rightsum = new int[n+1];for(int i = 0; i < n; i++){leftsum[i+1] = leftsum[i] + nums[i];}for(int i = n-1; i > 0; i--){rightsum[i-1] = rightsum[i] + nums[i];}int[] res = new int[n];for(int i = 0; i < n; i++){res[i] = Math.abs(leftsum[i] - rightsum[i]);}return res;}
}
6368. 找出字符串的可整除数组
难度中等4
给你一个下标从 0 开始的字符串 word ,长度为 n ,由从 0 到 9 的数字组成。另给你一个正整数 m 。
word 的 可整除数组 div 是一个长度为 n 的整数数组,并满足:
- 如果
word[0,...,i]所表示的 数值 能被m整除,div[i] = 1 - 否则,
div[i] = 0
返回 word 的可整除数组。
示例 1:
输入:word = "998244353", m = 3
输出:[1,1,0,0,0,1,1,0,0]
解释:仅有 4 个前缀可以被 3 整除:"9"、"99"、"998244" 和 "9982443" 。
示例 2:
输入:word = "1010", m = 10
输出:[0,1,0,1]
解释:仅有 2 个前缀可以被 10 整除:"10" 和 "1010" 。
提示:
1 <= n <= 105word.length == nword由数字0到9组成1 <= m <= 109
超长整数如何取余?
class Solution {// 本质就是超级长的整数如何取余public int[] divisibilityArray(String word, int m) {double x = 0; // 第 i 位 用第 i-1 位 * 10 + word[1] 表示, 来防止溢出int n = word.length();int[] res = new int[n];for(int i = 0; i < n; i++){x = (x*10 + (word.charAt(i) - '0')) % m;res[i] = (x == 0) ? 1 : 0;}return res;}
}
6367. 求出最多标记下标
难度中等17
给你一个下标从 0 开始的整数数组 nums 。
一开始,所有下标都没有被标记。你可以执行以下操作任意次:
- 选择两个 互不相同且未标记 的下标
i和j,满足2 * nums[i] <= nums[j],标记下标i和j。
请你执行上述操作任意次,返回 nums 中最多可以标记的下标数目。
示例 1:
输入:nums = [3,5,2,4]
输出:2
解释:第一次操作中,选择 i = 2 和 j = 1 ,操作可以执行的原因是 2 * nums[2] <= nums[1] ,标记下标 2 和 1 。
没有其他更多可执行的操作,所以答案为 2 。
示例 2:
输入:nums = [9,2,5,4]
输出:4
解释:第一次操作中,选择 i = 3 和 j = 0 ,操作可以执行的原因是 2 * nums[3] <= nums[0] ,标记下标 3 和 0 。
第二次操作中,选择 i = 1 和 j = 2 ,操作可以执行的原因是 2 * nums[1] <= nums[2] ,标记下标 1 和 2 。
没有其他更多可执行的操作,所以答案为 4 。
示例 3:
输入:nums = [7,6,8]
输出:0
解释:没有任何可以执行的操作,所以答案为 0 。
提示:
1 <= nums.length <= 1051 <= nums[i] <= 109
贪心 + 同向双指针
class Solution {// 2 3 4 5public int maxNumOfMarkedIndices(int[] nums) {Arrays.sort(nums);int res = 0;int n = nums.length;int left = 0, right = n / 2;while(left < n/2 && right < n){if(nums[left] * 2 <= nums[right]){res += 2;left++;right++;}else{right++;}}return res;}
}
二分答案
class Solution {/**二分答案:考虑匹配k对如果能匹配k对,则一定能匹配k-1对、k-2对...*/public int maxNumOfMarkedIndices(int[] nums) {Arrays.sort(nums);int left = 0, right = nums.length/2;while(left <= right){int mid = (left + right) >> 1;if(check(nums, mid)){left = mid+1;}else{right = mid-1;}}return right * 2;}public boolean check(int[] nums, int k){for(int i = 0; i < k; i++){if(nums[i] * 2 > nums[nums.length-k+i])return false;}return true;}
}
6366. 在网格图中访问一个格子的最少时间
难度困难15
给你一个 m x n 的矩阵 grid ,每个元素都为 非负 整数,其中 grid[row][col] 表示可以访问格子 (row, col) 的 最早 时间。也就是说当你访问格子 (row, col) 时,最少已经经过的时间为 grid[row][col] 。
你从 最左上角 出发,出发时刻为 0 ,你必须一直移动到上下左右相邻四个格子中的 任意 一个格子(即不能停留在格子上)。每次移动都需要花费 1 单位时间。
请你返回 最早 到达右下角格子的时间,如果你无法到达右下角的格子,请你返回 -1 。
示例 1:

输入:grid = [[0,1,3,2],[5,1,2,5],[4,3,8,6]]
输出:7
解释:一条可行的路径为:
- 时刻 t = 0 ,我们在格子 (0,0) 。
- 时刻 t = 1 ,我们移动到格子 (0,1) ,可以移动的原因是 grid[0][1] <= 1 。
- 时刻 t = 2 ,我们移动到格子 (1,1) ,可以移动的原因是 grid[1][1] <= 2 。
- 时刻 t = 3 ,我们移动到格子 (1,2) ,可以移动的原因是 grid[1][2] <= 3 。
- 时刻 t = 4 ,我们移动到格子 (1,1) ,可以移动的原因是 grid[1][1] <= 4 。
- 时刻 t = 5 ,我们移动到格子 (1,2) ,可以移动的原因是 grid[1][2] <= 5 。
- 时刻 t = 6 ,我们移动到格子 (1,3) ,可以移动的原因是 grid[1][3] <= 6 。
- 时刻 t = 7 ,我们移动到格子 (2,3) ,可以移动的原因是 grid[2][3] <= 7 。
最终到达时刻为 7 。这是最早可以到达的时间。
示例 2:

输入:grid = [[0,2,4],[3,2,1],[1,0,4]]
输出:-1
解释:没法从左上角按题目规定走到右下角。
提示:
m == grid.lengthn == grid[i].length2 <= m, n <= 10004 <= m * n <= 1050 <= grid[i][j] <= 105grid[0][0] == 0
Dijkstra求最短路径
题解:https://leetcode.cn/problems/minimum-time-to-visit-a-cell-in-a-grid/solution/er-fen-da-an-bfspythonjavacgo-by-endless-j10w/
class Solution {private final static int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int minimumTime(int[][] grid) {int m = grid.length, n = grid[0].length;if(grid[0][1] > 1 && grid[1][0] > 1) return -1;// 否则答案一定存在(因为可以反复横跳来拖延时间)// 到达grid[i][j] 的最小时间 dis[i][j] 一定是和 (i+j) 同奇偶的// 如果到达时不同奇偶, 则+1就行int[][] dis = new int[m][n];for(int i = 0; i < m; i++){Arrays.fill(dis[i], Integer.MAX_VALUE);}dis[0][0] = 0;PriorityQueue<int[]> pq = new PriorityQueue<>((a,b) -> a[0]-b[0]);pq.add(new int[]{0,0,0});while(true){int[] poll = pq.poll();int d = poll[0], i = poll[1], j = poll[2];if(i == m-1 && j == n-1) return d;for(int[] dir : dirs){ // 枚举周围四个格子int x = i + dir[0], y = j + dir[1];if(x >= 0 && x < m && y >= 0 && y < n){int nd = Math.max(d+1, grid[x][y]);nd += (nd-x-y) % 2; // nd 必须和 x+y 同奇偶if(nd < dis[x][y]){dis[x][y] = nd; // 更新最短路pq.add(new int[]{nd, x, y});}}}}}
}
二分答案
二分到终点的时间,然后跑 BFS
如果可以从终点到达起点,说明可以在大于 endTime 的时刻到达终点;反之,如果无法从终点到达起点,说明无法在小于 endTime 的时刻到达终点。
有单调性,可以二分到达终点的时间。
class Solution {private final static int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};private int[][] grid, vis;public int minimumTime(int[][] grid) {int m = grid.length, n = grid[0].length;if (grid[0][1] > 1 && grid[1][0] > 1) // 无法「等待」return -1;this.grid = grid;vis = new int[m][n];int left = Math.max(grid[m - 1][n - 1], m + n - 2) - 1;int right = (int) 1e5 + m + n; // 开区间while (left + 1 < right) {int mid = (left + right) >>> 1;if (check(mid)) right = mid;else left = mid;}return right + (right + m + n) % 2;}private boolean check(int endTime) {int m = grid.length, n = grid[0].length;vis[m - 1][n - 1] = endTime;var q = new ArrayList<int[]>();q.add(new int[]{m - 1, n - 1});for (int t = endTime - 1; !q.isEmpty(); --t) {var tmp = q;q = new ArrayList<>();for (var p : tmp) {int i = p[0], j = p[1];for (var d : dirs) { // 枚举周围四个格子int x = i + d[0], y = j + d[1];if (0 <= x && x < m && 0 <= y && y < n && vis[x][y] != endTime && grid[x][y] <= t) {if (x == 0 && y == 0) return true;vis[x][y] = endTime; // 用二分的值来标记,避免重复创建 vis 数组q.add(new int[]{x, y});}}}}return false;}
}
if (0 <= x && x < m && 0 <= y && y < n && vis[x][y] != endTime && grid[x][y] <= t) {if (x == 0 && y == 0) return true;vis[x][y] = endTime; // 用二分的值来标记,避免重复创建 vis 数组q.add(new int[]{x, y});}}}}return false;
}
}
相关文章:
周赛334(前缀和、贪心+双指针、Dijkstra求最短路径、二分答案)
文章目录[6369. 左右元素和的差值](https://leetcode.cn/problems/left-and-right-sum-differences/)前缀和[6368. 找出字符串的可整除数组](https://leetcode.cn/problems/find-the-divisibility-array-of-a-string/)超长整数如何取余?[6367. 求出最多标记下标](ht…...
imx6ull——I2C驱动
I2C基本介绍 SCL 为高电平,SDA 出现下降沿:起始位 SCL 位高电平,SDA出现上升沿:停止位 主机——从机地址(ack)——寄存器地址(ack)——数据(ack) 重点:先是写,…...
Spring Cache的基本使用与分析
概述 使用 Spring Cache 可以极大的简化我们对数据的缓存,并且它封装了多种缓存,本文基于 redis 来说明。 基本使用 1、所需依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-…...
【安全知识】——端口复用隐藏后门
作者名:白昼安全主页面链接: 主页传送门创作初心: 以后赚大钱座右铭: 不要让时代的悲哀成为你的悲哀专研方向: web安全,后渗透技术每日鸡汤: 精彩的人生是在有限的生命中实现无限价值端口复用是…...
Tina_Linux量产测试使用指南_new
OpenRemoved_Tina_Linux_量产测试_使用指南_new 1 概述 文档主要描述如何配置tinatest 并搭建量产测试环境。 1.1 编写目的 • 介绍量产配置方法; • 介绍量产测试环境搭建流程; • 介绍如何使用dragonMAT 软件; • 方便开发人员按照说明…...
STC32单片机 普通 I/O 口中断功能介绍和使用
STC32单片机 普通 I/O 口中断功能和使用✨STC32单片机普通 I/O 口中断,不是传统外部中断. 🔖手册上描述:STC32G 系列支持所有的 I/O 中断,且支持 4 种中断模式:下降沿中断、上升沿中断、低电平中断、高电平中断。每组 …...
计算机学生如何找到第一份实习?
作为一名计算机专业的学生,找到第一份实习是非常重要的一步,它不仅可以帮助你更好地了解行业,增加实践经验,还可以为即将到来的校招提供有力支持。计算机专业的校招,每年都在变得越来越卷。5年前,可能你只要…...
《Python机器学习》基础代码
1,要学习Python机器学习,第一步就是读入数据,这里我们以读入excel的数据为例,利用jupyter notebook来编码,具体教程看这个视频 推荐先上传到jupyter notebook,再用名字.xlsx来导入 Jupyter notebook导入Excel数据的两种方法介绍_哔哩哔哩_bilibili 2,…...
【前端】JS异步加载
文章目录为什么要异步加载如何实现异步加载参考为什么要异步加载 两个原因其实是一个意思。 原因1: JS是单线程的语言,它会同步的执行代码,从上往下执行 但是,一旦网络不好,或要加载的js文件过大的话,会…...
【MySQL】SQL语言的五个部分
DQL 数据查询语言(Data Query Language,DQL):DQL主要用于数据的查询,其基本结构是使用SELECT子句,FROM子句和WHERE子句的组合来查询一条或多条数据。 DML 数据操作语言(Data Manipulation La…...
详细的IO面试题汇总
IO 流简介 IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在…...
在Linux终端管理你的密码!
大家好,我是良许。 现在是互联网时代,我们每天都要跟各种 APP 、网站打交道,而这些东西基本上都需要注册才可以使用。 但是账号一多,我们自己都经常记不清对应的密码了。有些小伙伴就一把梭,所有的账号密码都是一样。…...
【设计模式】策略模式在Java工程中应用
在之前的文章中,曾经给大家介绍过策略模式:【设计模式】策略模式,在该篇文章中,我们曾很清楚的说到,策略模式主要解决的问题是:在有多种算法相似的情况下,解决使用 if...else 所带来的复杂和难以…...
Linux驱动开发工程师需要掌握哪些技能?
一、前言 Linux驱动开发是一项高度技术性的工作,需要深厚的编程技能和对计算机硬件的深入理解。随着物联网、人工智能等领域的快速发展,Linux驱动开发工程师的需求日益增加。在这篇文章中,我将为您介绍一条Linux驱动开发工程师的学习路线&am…...
【人脸识别】FROM:提升遮挡状态下的人脸识别效果
论文题目:《End2End Occluded Face Recognition by Masking Corrupted Features》 论文地址:https://arxiv.org/pdf/2108.09468v3.pdf 代码地址:https://github.com/haibo-qiu/from 1.前言 人脸识别技术已经取得了显著的进展,主要…...
浏览器缓存
什么是缓存? 当第一次访问网站的时候,比如www.baidu.com,电脑会图片,文件等下载下来,当第二次访问网站的时候,网站就会直接被加载出来. 缓存的好处? 减轻服务器压力,减少请求的放松.提高性能,在本地打开资源肯定比在服务器上获取要快减少宽带的消耗,当我们使用缓存时,只会…...
【软考 系统架构设计师】论文范文③ 论数据访问层设计技术及其应用
>>回到总目录<< 文章目录 论数据访问层设计技术及其应用范文摘要正文论数据访问层设计技术及其应用 在信息系统的开发与建设中,分层设计是一种常见的架构设计方法,区分层次的目的是为了实现“高内聚低耦合”的思想。分层设计能有效简化系统复杂性,使设计结构清…...
802.11 MCS 的最低SNR分析
常常看到这样的表格: 那么这个SNR如何而来? 看看RSSI和SNR的关系,它们之间隔了一个noise floor。从表格看得出,这个底噪在-80~-90之间。 而SNR的核心,也有类似的原因,它和BER有关。...
用于C++的对象关系映射库—YB.ORM
1 介绍YB.ORM YB.ORM 旨在简化与关系数据库交互的 C 应用程序的开发。 对象关系映射器(ORM) 通过将数据库表映射到类并将表行映射到应用程序中的对象来工作,这种方法可能不是对每个数据库应用程序都是最佳的,但它被证明在需要复杂逻辑和事务处理的应用程…...
Cesium 100K数据加载 支持弹窗 动态更改位置
前言:今天总结关于point、label、billboard海量数据加载。后续会研究下大量model加载以及大bim(几百G上T)模型记载 海量点加载 弹窗 加载点位时,不加载弹窗。点击点位时在加载弹窗,及有效的减少加载量,优化性能。 const handler …...
C++轻量级HTTP库cpp-httplib:从嵌入式设备到企业服务的全场景解决方案
C轻量级HTTP库cpp-httplib:从嵌入式设备到企业服务的全场景解决方案 【免费下载链接】cpp-httplib A C header-only HTTP/HTTPS server and client library 项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib 在现代C开发中,构建网络…...
Spring AI + DeepSeek 实战:5分钟搞定一个能听懂人话的数据库查询工具
Spring AI DeepSeek 实战:5分钟搞定一个能听懂人话的数据库查询工具 在数据驱动的时代,数据库查询是每个开发者绕不开的日常任务。但当你面对产品经理频繁变更的需求,或是运营同事临时提出的数据提取请求时,反复编写和调试SQL语句…...
【深度强化学习】DDPG算法在连续动作空间中的实战解析
1. DDPG算法初探:为什么我们需要它? 第一次接触DDPG(Deep Deterministic Policy Gradient)算法时,我完全被这个拗口的名字吓到了。但当我真正理解它的设计初衷后,才发现它其实解决了一个非常实际的问题——…...
英伟达黄仁勋力荐!2026年AI Agent元年,掌握这5大关键技术,成为行业风口!
0****1 什么是AI Agent? 随着人工智能技术加速演进,AI Agent(人工智能代理,常称智能体)正悄然渗透到企业运营与日常生活的各个角落,从大家熟悉的虚拟助手(如Siri、小爱同学、豆包)&a…...
python-flask-djangol框架的的畜牧站疾病防控与检测系统
目录技术选型与架构设计核心功能模块实现数据可视化与决策支持移动端适配与离线功能测试与部署方案项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与架构设计 后端采用Python Flask框架,轻量级且灵活性高&…...
SPIRAN ART SUMMONER优化指南:如何调整参数让生成的图片更符合预期
SPIRAN ART SUMMONER优化指南:如何调整参数让生成的图片更符合预期 1. 理解SPIRAN ART SUMMONER的核心参数 SPIRAN ART SUMMONER作为一款基于Flux.1-Dev模型的图像生成工具,其参数设置直接影响最终输出效果。与普通AI绘画工具不同,它融入了…...
制造业数据库选型实战:为什么我们从 MySQL 迁移到 TiDB
写在前面 作为一个制造业数字化团队的开发负责人,我最怕听到的一句话就是:“数据库又慢了”。 MOM 平台上线 4 年,数据量从最初的几百 G 涨到几个 T。每次月底报表、跨工厂查询,系统就开始”喘气”。加索引、拆表、优化 SQL………...
售前客户需求深度挖掘:从表面诉求到核心痛点的五步法
# 003、客户需求深度挖掘:从表面诉求到核心痛点的五步法---上周调一个嵌入式项目,客户说“设备偶尔会死机,重启就好”。我们查了三天的日志,发现是内存泄漏。但真正的问题是什么?是代码质量?不完全是。最后…...
OpenSpec 生成文件说明
proposal.md —— 为什么做、做什么(产品/范围) Why:要解决什么问题、机会是什么。What Changes:会新增/改掉/删掉哪些能力,有没有 BREAKING。Capabilities:会动到哪些能力名(对应后面 specs/&l…...
医药行业用友 YonSuite 一体化管理方案
医保新规 4 月 1 日落地|医药企业破局:数智化 合规 精细化,活下去且活得好2026 年 4 月 1 日,医保新规全面执行,集采深化、价格严控、全链路监管,医药行业正式告别高毛利、粗放式、渠道为王的旧时代&…...
