【Leetcode 每日一题 - 扩展】1326. 灌溉花园的最少水龙头数目

ops/2024/12/18 12:55:23/

问题背景

x x x 轴上有一个一维的花园。花园长度为 n n n,从点 0 0 0 开始,到点 n n n 结束。
花园里总共有 n + 1 n + 1 n+1 个水龙头,分别位于 [ 0 , 1 , . . . , n ] [0, 1, ..., n] [0,1,...,n]
给你一个整数 n n n 和一个长度为 n + 1 n + 1 n+1 的整数数组 r a n g e s ranges ranges,其中 r a n g e s [ i ] ranges[i] ranges[i](下标从 0 0 0 开始)表示:如果打开点 i i i 处的水龙头,可以灌溉的区域为 [ i − r a n g e s [ i ] , i + r a n g e s [ i ] ] [i - ranges[i], i + ranges[i]] [iranges[i],i+ranges[i]]
请你返回可以灌溉整个花园的 最少水龙头数目 。如果花园始终存在无法灌溉到的地方,请你返回 − 1 -1 1

数据约束

  • 1 ≤ n ≤ 1 0 4 1 \le n \le 10 ^ 4 1n104
  • r a n g e s . l e n g t h = n + 1 ranges.length = n + 1 ranges.length=n+1
  • 0 ≤ r a n g e s [ i ] ≤ 100 0 \le ranges[i] \le 100 0ranges[i]100

解题过程

首先要理解题目给的第二个样例为什么不满足条件,这里灌溉的意思是区间内部(形态是线段的那个部分)也需要覆盖到,所以总体上要当成一个区间着色问题来处理。
这题比较难的是转化的过程,如果不加限制地在数组中按最大值来选择,会出现很多空隙,比较难解决。
考虑在每个位置上,如果可以任意打开一个水龙头,那么它在覆盖到这个位置的前提下,最远能够顾及到什么位置。
比如在下标为 2 2 2 这个位置上打开了覆盖范围为 2 2 2 的水龙头,可以转化为在 0 0 0 这个位置上,有一个水龙头能够覆盖到 2 2 2 这个范围(当然这样举例它不一定是最大的)。
这样一来,就可以用类似 跳跃游戏 II 的贪心算法,来搞定这个问题。唯一的区别是这道题没有保证一定有符合条件的答案,所以要单独判断什么时候返回 − 1 -1 1

具体实现

class Solution {public int minTaps(int n, int[] ranges) {// 定义一个数组来记录每个位置上可能达到的最远边界int[] ends = new int[n + 1];for(int i = 0; i <= n; i++) {int range = ranges[i];// 如果超过可达范围,也就是左边最远的地方不会到达下标为 0 的位置,可以直接记录答案if(i > range) {ends[i - range] = i + range;} else {ends[0] = Math.max(ends[0], i + range);}}int res = 0;int curEnd = 0;int nextEnd = 0;for(int i = 0; i < n; i++) {nextEnd = Math.max(nextEnd, ends[i]);if(i == curEnd) {// 如果达到了当前所能达到的最远位置,但没有继续延伸的可能,应该返回 -1if(i == nextEnd) {return -1;}curEnd = nextEnd;res++;}}return res;}
}

http://www.ppmy.cn/ops/142908.html

相关文章

el-table 多表头+跨行跨列案例

效果&#xff1a; 代码&#xff1a; index.vue <template><div class"my-table"><el-tablev-loading"table.loading":data"table.data"bordersize"mini":header-cell-style"headerCellStyle":span-method&qu…

python的sys模块学习与实践

一、sys模块是python内置模块&#xff0c;他提供了一些简单的函数和变量&#xff0c;用于访问与python解释器和python环境相关的变量与功能。 二、使用时&#xff0c;需要导入 import sys 三、sys模块的函数 1、sys.exit() 代表从python程序中退出&#xff0c;调用sys.exi…

python基础:(八)文件

目录 一.从文件中读取数据1.1读取整个文件1.2文件路劲1.3逐行读取 二.写入文件 一.从文件中读取数据 各位小伙伴&#xff0c;文件这一块得好好学&#xff0c;多看多敲代码&#xff0c;以后处理数据&#xff0c;写爬虫少不了这个&#xff0c;先从基础&#xff08;简单的&#x…

算法学习之贪心算法

前言 记录一下&#xff0c;免得又又忘了 贪心算法 在刚接触的时候&#xff0c;我一直觉得贪心和动态规划有相似之处&#xff0c;但做过的题目看&#xff0c;贪心似乎不用迭代

如何在OpenCV中运行自定义OCR模型

我们首先介绍如何获取自定义OCR模型&#xff0c;然后介绍如何转换自己的OCR模型以便能够被opencv_dnn模块正确运行&#xff0c;最后我们将提供一些预先训练的模型。 训练你自己的 OCR 模型 此存储库是训练您自己的 OCR 模型的良好起点。在存储库中&#xff0c;MJSynthSynthTe…

vscode中插件ofExtensions的debug模式也无法查看U、p等openfoam中foam类型的变量

插件介绍&#xff1a; 主要内容如下&#xff1a; 以自编译的$HOME/OpenFOAM-7例&#xff0c;如果OFdebugopt设置为WM_COMPILE_OPTIONDebug&#xff0c;那最终的激活环境的命令为source $HOME/OpenFOAM/OpenFOAM-8/etc/bashrc WM_COMPILE_OPTIONDebug&#xff0c;这时候$FOAM_…

【Go卸载时:遇到无法卸载情况】

进入go&#xff0c;先把之前的版本下载一遍&#xff0c;进入后点击repair。 go下载地址&#xff1a;https://go.dev/dl/ 然后下载新版本即可

多维高斯分布

高斯分布&#xff08;Gaussian Distribution&#xff09; 高斯分布&#xff0c;又称正态分布&#xff0c;是一种最常见的概率分布形式&#xff0c;广泛应用于统计学、机器学习和自然科学等领域。 高斯分布的概率密度函数&#xff08;PDF&#xff09; 对于给定的均值 μ 和方差…