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

【Leetcode 每日一题】3356. 零数组变换 II

问题背景

给你一个长度为 n n n 的整数数组 n u m s nums nums 和一个二维数组 q u e r i e s queries queries,其中 q u e r i e s [ i ] = [ l i , r i , v a l i ] queries[i] = [l_i, r_i, val_i] queries[i]=[li,ri,vali]
每个 q u e r i e s [ i ] queries[i] queries[i] 表示在 n u m s nums nums 上执行以下操作:

  • n u m s nums nums [ l i , r i ] [l_i, r_i] [li,ri] 范围内的每个下标对应元素的值 最多 减少 v a l i val_i vali
  • 每个下标的减少的数值可以 独立 选择。

零数组 是指所有元素都等于 0 0 0 的数组。
返回 k k k 可以取到的 最小非负 值,使得在 顺序 处理前 k k k 个查询后, n u m s nums nums 变成 零数组。如果不存在这样的 k k k,则返回 − 1 -1 1

数据约束

  • 1 ≤ n u m s . l e n g t h ≤ 10 5 1 \le nums.length \le 10 ^ 5 1nums.length105
  • 0 ≤ n u m s [ i ] ≤ 5 × 10 5 0 \le nums[i] \le 5 \times 10 ^ 5 0nums[i]5×105
  • 1 ≤ q u e r i e s . l e n g t h ≤ 10 5 1 \le queries.length \le 10 ^ 5 1queries.length105
  • q u e r i e s [ i ] . l e n g t h = 3 queries[i].length = 3 queries[i].length=3
  • 0 ≤ l i ≤ r i < n u m s . l e n g t h 0 \le l_i \le r_i < nums.length 0liri<nums.length
  • 1 ≤ v a l i ≤ 5 1 \le val_i \le 5 1vali5

解题过程

由于应用的查询越多,越有可能满足条件,所以答案是具有单调性的,可以考虑借助 零数组变换 I 结合二分查找来实现。
也可以在每个位置线性地执行所有可能的查询,根据各个位置是否符合要求来判断,这样用双指针完成,效率更高。

具体实现

二分查找

class Solution {public int minZeroArray(int[] nums, int[][] queries) {int n = queries.length;int left = 0, right = n + 1;while (left < right) {int mid = left + ((right - left) >>> 1);if (check(mid, nums, queries)) {right = mid;} else {left = mid + 1;}}return right <= n ? right : -1;}private boolean check(int k, int[] nums, int[][] queries) {int n = nums.length;int[] diff = new int[n + 1];for (int i = 0; i < k; i++) {int[] query = queries[i];int left = query[0], right = query[1], value = query[2];diff[left] += value;diff[right + 1] -= value;}int num = 0;for (int i = 0; i < n; i++) {num += diff[i];if (nums[i] > num) {return false;}}return true;}
}

双指针

class Solution {public int minZeroArray(int[] nums, int[][] queries) {int n = nums.length;int[] diff =  new int[n + 1];int num = 0;int k = 0;for (int i = 0; i < n; i++) {int cur = nums[i];num += diff[i];while (k < queries.length && num < cur) {int[] query = queries[k];int left = query[0], right = query[1], value = query[2];diff[left] += value;diff[right + 1] -= value;if (left <= i && i <= right) {num += value;}k++;}if (num < cur) {return -1;}}return k;}
}
http://www.xdnf.cn/news/7685.html

相关文章:

  • Memory模块是agent的一个关键组件
  • 工业视觉缺陷检测的算法总结
  • SpringBoot JAR 启动原理
  • 【C++】从零认识C++的“继承”
  • 【Linux笔记】——线程池项目与线程安全单例模式
  • 【SFT监督微调总结】大模型SFT全解析:从原理到工具链,解锁AI微调的核心密码
  • JAVA虚拟机有义务保证<clinit>()方法的线程安全
  • 【工程篇】03:Miniconda安装
  • DAY31-文件的规范拆分和写法
  • 现代计算机图形学Games101入门笔记(十七)
  • Python Pandas库简介及常见用法
  • Nature 子刊排名(2025 版)
  • Java从入门到精通 - 案例专题
  • nRF Connect SDK开发之(1)环境搭建
  • 一文掌握 LoRA 常见变体
  • SpringBoot集成Jasypt对数据库连接密码进行加密、解密
  • vue2的项目登录逻辑
  • Java核心基础知识点全解析:从语法到应用实践
  • python-leetcode 69.最小栈
  • 【华为OD- B卷 - 增强的strstr 100分(python、java、c++、js、c)】
  • 连接Redis数据库
  • 初识Linux · 数据链路层
  • PyTorch图像识别模型和图像分割模型体验
  • 【Java 反射的使用】
  • (T_T),不小心删掉RabbitMQ配置文件数据库及如何恢复
  • Python训练营---Day31
  • 大模型幻觉
  • CAN总线
  • mbed驱动st7789屏幕-硬件选择及连接(1)
  • TDengine 更多安全策略