leetcode 1326. Minimum Number of Taps to Open to Water a Garden

在这里插入图片描述

x轴上的花园范围为[0,n], 0~n这个n+1个离散点上有水龙头,第 i 个水龙头能浇水的范围为[i-ranges[i], i+ranges[i]].
求能浇整个花园的最小水龙头个数。

思路:

方法一
greedy

先把每个水龙头能浇的区间准备好,
用一个数组保存所有区间,数组下标为区间起点,数组内容为区间终点。

然后从左到右遍历这个数组,到这里就和55题Jump Game类似了。
用一个变量canReach表示到目前的水龙头为止能浇到的最远距离。preEnd表示前一个水龙头的区间终点。

如果当前位置 > preEnd,说明需要开一个新的水龙头,
但是如果这时canReach <= preEnd(前一水龙头处能浇到的最远距离也无法到达当前位置,后面有说明),说明无法到达,返回-1.
更新preEnd到canReach (canReach这时还没有更新,即preEnd更新到前一个水龙头为止的最远范围). 水龙头个数+1.
把canReach更新到和当前区间终点相比的较大值。

有一个特殊情况要注意下,就是Example2中ranges[i]=0的情况。
注意能浇水到整个花园说明不止是离散点i , i+1, …能浇到,i 到 i+1之间的连续点部分也必须在区间中。
而ranges[i] = 0 表示只能浇到离散点 i 本身。比如1,2点能浇到,但它们之间的1.1, 1.2, …都不在浇灌范围。
所以在处理区间时,canReach必须能到达当前点才算满足条件。

    public int minTaps(int n, int[] ranges) {int preEnd = 0;int canReach = 0;int[] startEnd = new int[n+1];int cnt = 0;for(int i = 0; i <= n; i++) {if(ranges[i] == 0) continue;int start = (i - ranges[i] < 0 ? 0 : i - ranges[i]);int end = (i + ranges[i] > n ? n : i + ranges[i]);startEnd[start] = end;}for(int i = 0; i <= n; i++) {if(i > preEnd) {if(canReach <= preEnd) return -1;cnt ++;preEnd = canReach;}if(startEnd[i] > canReach) canReach = startEnd[i];}//cnt是前一区间满足条件时在当前区间加的,最后一个区间没有下一区间去处理,所以要在最后处理一下//如果preEnd能到达最后位置,就不需要cnt+1,如果到不了,需要再cnt++,preEnd更新到canReachreturn cnt + (preEnd < n ? 1 : 0);}

方法二

DP
dp[i ] 表示浇到 i 位置所需的水龙头个数。
开始的时候,除了dp[0],其他全部初始化为无穷大。

还是像上面一样从左到右计算每个水龙头的浇水区间。
区间内每个点处所需的最少水龙头个数dp[ i ] = min(dp[i], dp[区间的起点]+1).
这是什么意义呢?
因为dp[0]=0, 当更新水龙头0的区间时,都会以dp[0]+1为准,把0处的水龙头能浇到的范围内,每个点处所需水龙头个数更新为1.
假设第一个区间为[0,2],更新如下
1 1 1 Inf Inf Inf
这时假如进入下一区间[2,4],那么在2的位置,仍然可以保持dp[2]=min(dp[2], dp[2]+1)=1.
到了位置3时,dp[3]=min(Inf,dp[2]+1)就变成需要2个水龙头。
同样的,如果前一范围覆盖不到后面的区间,就会出现min(inf, inf+1)的情况。
最后返回dp[n], 如果dp[n]为Inf, 说明无法浇到整个花园,返回-1.

    public int minTaps(int n, int[] ranges) {final int INF = 100000;int[] dp = new int[n+1];Arrays.fill(dp, INF);dp[0] = 0;for(int i = 0; i <= n; i++) {int start = (i-ranges[i] < 0 ? 0 : i-ranges[i]);int end = (i + ranges[i] > n ? n : i+ranges[i]);for(int j = start; j <= end; j++){dp[j] = Math.min(dp[j], dp[start]+1);}}return dp[n] == INF ? -1 : dp[n];}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/116353.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C盘扩容遇到的问题(BitLocker解密、)

120G的C盘不知不觉的就满了&#xff0c;忍了好久终于要动手了。 尽管电脑-管理--磁盘管理里可以进行磁盘大小调整&#xff0c;但由于各盘都在用&#xff0c;不能够连续调整&#xff0c;所以选用DiskGenius。 # DiskGenius调整分区大小遇到“您选择的分区不支持无损调整容量” …

stable diffusion实践操作-提示词

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、提示词是什么&#xff1f;1.1、提示词的原理 二、使用步骤2.1 核心原则2.2、提示词分类2.2.1 正向提示词2.2.2 反向提示词 2.3、提示词书写模板2.3.1 画质&#xff1a;2.3.2. 主体结构2.3.3. 主体细节2.3…

Ubuntu 20.04 Server配置网络

0&#xff0c;环境 服务器&#xff1a; Intel(R) Xeon(R) Gold 6248R CPU 3.00GHz 96核 网卡&#xff1a; 多网卡 1&#xff0c; 镜像下载 http://old-releases.ubuntu.com/releases/ubuntu-20.04.1-desktop-amd64.iso 2&#xff0c; 系统安装--具体步骤就不贴出来&#…

Python基础之基础语法(二)

Python基础之基础语法(二) 语言类型 静态语言 如&#xff1a;C C Java ina a 100 a 100 a abc # 不可以静态语言需要指定声明标识符的类型&#xff0c;之后不可以改变类型赋值。静态语言变异的时候要检查类型&#xff0c;编写源代码&#xff0c;编译时检查错误。 动态语…

2018ECCV Can 3D Pose be Learned from2D Projections Alone?

摘要 在计算机视觉中&#xff0c;从单个图像的三维姿态估计是一个具有挑战性的任务。我们提出了一种弱监督的方法来估计3D姿态点&#xff0c;仅给出2D姿态地标。我们的方法不需要2D和3D点之间的对应关系来建立明确的3D先验。我们利用一个对抗性的框架&#xff0c;强加在3D结构…

芯探科技--泛自动驾驶激光雷达解决方案

泛自动驾驶应用领域: 无人配送车 无人叉车 服务机器人 无人清扫车 …… 泛自动驾驶激光雷达解决方案介绍 在中低速移动过程中,类似无人配送车、无人叉车、服务型机器人、无人清扫车等具有自动驾驶功能的车辆,其需要对周围的环境进行探测,进而实现…

Maven基础的快速入门

导读 概念&#xff1a;Maven是apache旗下的一个开源项目&#xff0c;是一款用于管理和构建Java项目的工具 Maven的作用&#xff1a; 1.依赖管理&#xff1a;放便快捷的管理项目依赖的资源&#xff08;jar包&#xff09;&#xff0c;避免版本冲突的问题 2.统一项目结构&…

在工具提示中使用自绘修改字体

在上一篇文章中&#xff0c;我们学习了如何在应用程序中添加工具提示。在之前的例子代码中&#xff0c;我们通过简单地为创建的工具提示设置了目标字体&#xff0c;这种方法很简单&#xff0c;因为自始至终&#xff0c;我们都只创建了一个工具提示。 但是&#xff0c;如果在应…

k8s(kubernetes)介绍篇

一、Kubernetes 是什么 Kubernetes 是一个全新的基于容器技术的分布式架构解决方案&#xff0c;是 Google 开源的一个容器集群管理系统&#xff0c;Kubernetes 简称 K8S。 Kubernetes 是一个一站式的完备的分布式系统开发和支撑平台&#xff0c;更是一个开放平台&#xff0c;对…

计算机网络 概述部分

目录 计算机网络在信息时代的作用 计算机网络的重要特征 网络&#xff0c;internet,Internet的区别 局域网 广域网的区别 网络协议的分层 计算机网络在信息时代的作用 计算机网络的重要特征 连通性&#xff1a;彼此联通&#xff0c;交换信息 共享性&#xff1a;信息共享…

【Java核心知识】线程基础知识

文章目录 线程线程与进程的区别创建线程的方法方法一&#xff1a;继承Thread类方法二&#xff1a;实现Runnable接口方法三&#xff1a;使用Callable和FutureTask创建带返回值的线程方法四&#xff1a;通过线程池创建线程 线程的基本操作线程的状态守护线程 线程 线程与进程的区…

解决:burpsuite——Connection refused: no further information

出现该问题的原因是开启了SOCKS proxy&#xff1b;关闭该选项即可正常抓包。 具体操作&#xff1a;

pytest---添加自定义命令行参数(pytest_addoption )

前言 在目前互联网公司中&#xff0c;都会存在多个测试环境&#xff0c;那么当我们编写的自动化想要在多套测试环境下进行运行时&#xff0c;如何使用&#xff1f;大多数人想到的可能是通过将我们自动化代码中的地址修改成不同环境&#xff0c;但是这时候就会增加一些工作量&am…

低成本32位单片机电动工具无感方波控制方案

RAMSUN介绍基于灵动32位微处理器MM32SPIN0230的BLDC电动工具无感方波控制方案&#xff0c;包括MM32SPIN0230芯片资源。 以下是电动工具无感方波控制方案的简述&#xff1a; MM32SPIN0230电动工具专用板 芯片介绍 MM32SPIN0230系列是灵动微MindSPIN旗下高性能的单电机控制产品…

打破对ChatGPT的依赖以及如何应对ChatGPT的错误和幻觉

​ OpenAI的ChatGPT是第一个真正流行的生成式AI工具&#xff0c;但它可能不是最好的。现在是时候扩大你的AI视野了。 ChatGPT成为了基于大语言模型(LLM)的聊天机器人的同义词。但是现在是时候停止对ChatGPT的痴迷&#xff0c;开始发现这个新世界中强大的替代品了。 首先&a…

【BUG事务内消息发送】事务内消息发送,事务还未结束,消息发送已被消费,查无数据怎么解决?

问题描述 在一个事务内完成插入操作&#xff0c;通过MQ异步通知其他微服务进行事件处理。 由于是在事务内发送&#xff0c;其他服务消费消息&#xff0c;查询数据时还不存在如何解决呢&#xff1f; 解决方案 通过spring-tx包的TransactionSynchronizationManager事务管理器解…

基于YOLO v5的病虫害检测与优化

《A fast and lightweight detection algorithm for passion fruit pests based on improved YOLOv5》 a new point-line distance loss function is proposed to reduce redundant computations and shorten detection timethe attention module is added to the network for…

K8S容器OOM killed排查

背景 数据服务平台南海容器k8s设置的内存上限2GB&#xff0c;多次容器被OOM killed。 启动命令 java -XX:MaxRAMPercentage70.0 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/apps/logs/ ***.jar排查过程 1 当收到实例内存超过95%告警时&#xff0c;把jvm进程堆dump下…

MongoDB入门

简介 MongoDB是一个开源、高性能、支持海量数据存储的文档型数据库 是NoSQL数据库产品中的一种&#xff0c;是最像关系型数据库&#xff08;MySQL&#xff09;的非关系型数据库 内部采用BSON(二进制JSON)格式来存储数据,并支持水平扩展。 MongoDB本身并不是完全免费的,它对于…

Go map转json

在Go中如何返回前端 字段名称/数量都不确定的json数据&#xff1f; 之前用Go写web服务&#xff0c;返回给前端的json格式的接口&#xff0c;有哪些要返回的字段都是明确的。都是预先定义一个结构体&#xff0c;json.Marshal一下即可~ 但当有的场景&#xff0c;要返回哪些字段不…