LeetCode 1326. Minimum Number of Taps to Open to Water a Garden【贪心,桶排序】

news2024/9/29 17:36:19

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

There is a one-dimensional garden on the x-axis. The garden starts at the point 0 and ends at the point n. (i.e The length of the garden is n).

There are n + 1 taps located at points [0, 1, ..., n] in the garden.

Given an integer n and an integer array ranges of length n + 1 where ranges[i] (0-indexed) means the i-th tap can water the area [i - ranges[i], i + ranges[i]] if it was open.

Return the minimum number of taps that should be open to water the whole garden, If the garden cannot be watered return -1.

Example 1:

Input: n = 5, ranges = [3,4,1,1,0,0]
Output: 1
Explanation: The tap at point 0 can cover the interval [-3,3]
The tap at point 1 can cover the interval [-3,5]
The tap at point 2 can cover the interval [1,3]
The tap at point 3 can cover the interval [2,4]
The tap at point 4 can cover the interval [4,4]
The tap at point 5 can cover the interval [5,5]
Opening Only the second tap will water the whole garden [0,5]

Example 2:

Input: n = 3, ranges = [0,0,0,0]
Output: -1
Explanation: Even if you activate all the four taps you cannot water the whole garden.

Constraints:

  • 1 <= n <= 104
  • ranges.length == n + 1
  • 0 <= ranges[i] <= 100

题意:x轴上一座一维花园 [0, n],长度为 n 。花园中共有 n + 1 个水龙头,分别位于 [0, 1, ..., n] ,整数数组 ranges 中的 ranges[i] 表示 i 处水龙头可以灌溉 [i -  ranges[i], i + ranges[i]] 区域。返回可以灌溉整个花园的最少水龙头数目,如果无法完全灌溉,则返回-1。


解法 贪心+桶排(最优)

首先解释示例2为什么要输出-1:因为「整个花园」包含不是整点的位置,即小数位置也要被灌溉到,但输入只能灌溉 0 , 1 , 2 , 3 0,1,2,3 0,1,2,3 4 4 4 个整点。

一般来说,这种覆盖区间类型的题,可以先进行常规排序再求解,但时间复杂度会到 O ( n log ⁡ n ) O(n\log n) O(nlogn) 。直观来说,第一次选择的区间,自然会想让它的左边界不大于0的同时,右边界尽可能地大,然后第二次选择区间,在其左边界不大于第一次选择的右边界的同时,右边界尽可能地大,依次类推,直至右边界到达n。如果用这种方法,我们就可以按照每一个区间的左边界,对其进行正序排序(不用排序二级排序右边界)。

借用别人的图:
img|500

由于这里区间的左边界是整数,可以使用桶排,设置一个 rightMost 数组,对当前的 i 及其半径 ranges[i]

  • i > ranges[i] 时,对该水龙头能覆盖的最左边界 i - ranges[i] 而言,能覆盖的最右边界一定是 i + ranges[i] ,即 rightMost[i - ranges[i]] = i + ranges[i] 。假如 j < i ,且 j - ranges[j] 能覆盖的最左边界也是 i - ranges[i] ,则 ranges[j] 一定小于 ranges[i] 、且 j + ranges[j] < i + ranges[i]
  • i <= ranges[i] 时,更新 rightMost[0] 的值为 max(rightMost[0], i + ranges[i] ,即灌溉最左边界小于等于0的水龙头中,灌溉最右边界不一定是 i + ranges[i] ,取最大值。
class Solution {
public:
    int minTaps(int n, vector<int>& ranges) {
        vector<int> rightMost(n + 1);
        for (int i = 0; i <= n; ++i) {
            int r = ranges[i]; // r是半径
            if (i > r) rightMost[i - r] = i + r; // 对于i-r来说,i+r必然是它目前的最大值
            else rightMost[0] = max(rightMost[0], i + r);
        }
        int ans = 0;
        int curRight = 0, nextRight = 0; // 已建造的桥的右端点,下一座桥的右端点的最大值
        for (int i = 0; i < n; ++i) { // 注意这里没有遍历到n,因为它已经是终点了
            nextRight = max(nextRight, rightMost[i]);
            if (i == curRight) { // 到达已被覆盖的灌溉处的右端点 // 到达已建造的桥的右端点 
                if (i == nextRight) return -1; // 无论怎么开水龙头,都无法从i灌溉到i+1 // 无论怎么造桥,都无法从i到i+1
                curRight = nextRight; // 开能到最右处的水龙头 // 造一座桥
                ++ans;
            }
        }
        return ans;
    }
}; 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路由网络的构建与配置

Part.1 ⑴ 需求分析 在构建的局域网中&#xff0c;通过路由器间配置静态路由&#xff0c;实现PC1和PC2主机直接连通&#xff0c;主机网段不能与路由器直接互联网段通信。 ⑵ 环境要求 配置虚拟网卡的计算机&#xff0c;安装华为eNSP模拟软件。 规划拓扑 Part.2 ⑴ 拓扑描述…

NVIC 简介、抢占优先级和响应优先级

NVIC 简介 NVIC 是嵌套向量中断控制器&#xff0c;控制着整个芯片中断相关的功能&#xff0c;它跟内核紧密耦合&#xff0c;是内核里面的一个外设。 如果医院只有医生的话&#xff0c;当看病的人很多时&#xff0c;医生就得安排一下先看谁&#xff0c;后看谁&#xff0c;如果…

29 openEuler管理网络-配置网络绑定

文章目录29 openEuler管理网络-配置网络绑定29.1 使用nmcli29.2 使用命令行29.2.1 检查是否已安装Bonding内核模块29.2.2 创建频道绑定接口29.2.3 创建从属接口29.2.4 激活频道绑定29.2.5 创建多个绑定29 openEuler管理网络-配置网络绑定 29.1 使用nmcli 创建名为bond0的绑定&…

vue 组合API

一、组合API是什么&#xff1f;通过创建 Vue 组件&#xff0c;我们可以将界面中重复的部分连同其功能一起提取为可重用的代码段。组合api提供复用性降低耦合性增加可读性下面我们来看下在vue2.0中的一个场景&#xff1a;在2.0里面的**exportdefault{}**通常是由components、pro…

5.排序算法之二:选择排序

选择排序&#xff08;select sort&#xff09;在无序列表中&#xff0c;把无序列表分成有序区&#xff08;刚开始有序区元素个数为0&#xff09;和无序区&#xff08;刚开始无序区元素个数为n&#xff09;&#xff0c;循环n-1趟&#xff0c;每一趟找到最小或最大的那个元素&…

CNC数据采集解决方案(2023杭州乐芯科技)

杭州乐芯科技IOT数据采集平台产品是杭州乐芯科技有限公司为满足工业4.0大型集团工厂推出的新一代数据采集平台级产品&#xff0c;可满足单一平台&#xff08;一个服务器&#xff09;同时采集各类设备&#xff0c;同时兼容各种工业数据采集协议&#xff0c;单服务器压力测试达10…

chainWebpack之optimization.splitChunks的cacheGroups缓存组代码分块实践案

研究了好几天webpack打包&#xff0c;我们项目是vue的高版本&#xff0c;已经没有了webpack.config.js文件了&#xff0c;是直接在vue.config.js里的chainWebpack方法直接配置&#xff0c;这样做法的好处是用户既可以保留webpack的默认配置&#xff0c;又可以通过chainWebpack设…

【Java开发】JUC基础 05:线程通信/协作

1 生产者消费者问题&#x1f4cc; 线程通信应用的场景可以简单地描述为生产者和消费者问题假设仓库中只能存放一件产品&#xff0c;生产者将生产出来的产品放入仓库&#xff0c;消费者将仓库中产品取走消费&#xff1b;如果仓库中没有产品&#xff0c;则生产者将产品放入仓库&a…

Java知识复习(八)Spring基础

1、什么是Spring框架&#xff1f; Spring &#xff1a;是一款开源的轻量级 Java 开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性 2、Spring、SpringMVC和SpringBoot的区别 Spring主要指Spring Framework&#xff0c;就是指如上图所示的各项功能模块Spr…

【Java 多线程学习】

多线程学习多线程1. 并行与并发2.进程和线程3. *****多线程的实现方式3.1 继承Thread类的方式进行实现3.2 实现Runnable接口方式进行实现3.3 利用Callable和Future接口方式实现3.4 设置获取线程名字4.获得线程对象5.线程休眠6.线程调度[线程的优先级]7.后台线程/守护线程多线程…

Pytest自动化框架-权威教程02-Pytest 使用及调用方法

Pytest 使用及调用方法使用python -m pytest调用pytest2.0版本新增你可以在命令行中通过Python编译器来调用Pytest执行测试:Copypython -m pytest [...]通过python调用会将当前目录也添加到sys.path中,除此之外,这几乎等同于命令行直接调用pytest [...]。可能出现的执行退出cod…

【K8S笔记】Kubernetes 集群架构与组件介绍

K8S 官方文档 https://kubernetes.io/zh/docs/home ##注重关注 概念和任务 板块。 K8S 集群架构 K8S也是运用了分布式集群架构&#xff1a; 管理节点/Master 整个集群的管理&#xff0c;任务协作。工作节点/Node 容器运行、删除。 K8S 组件介绍 管理节点/Master 相关组件 …

JDK1.8 ConcurrentHashMap

数据结构锁sizeCtlconcurrencyLevelForwardingNode、ReservationNode扩容get、put、removehashmap&#xff1a;线程不安全 hashtable&#xff1a;通过synchronized保证线程安全但效率低。强一致性 ConcurrentHashMap&#xff1a;弱一致性 数据结构 ConcurrentHashMap为node数…

前端转golang从小白到实战自学笔记(2023/3/1)

了解&#xff1a;https://www.runoob.com/go/go-concurrent.htmlgolang学习方向区块链研发工程师go服务器>&#xff08;特点&#xff1a;数据处理&#xff0c;处理大并发&#xff09;/游戏软件工程师golang分布式/云计算软件工程师&#xff08;盛大云、cdn、京东&#xff09…

Mybatis主要流程源码分析

分层架构图 主要流程图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d9uhH9IK-1677658947721)(https://note.youdao.com/yws/public/resource/7f152b4b25320263d411a49583d3f4db/xmlnote/WEBRESOURCE9ea90840088eaeaa4a463bbc3f1912e8/17619)] 主…

索引优化与查询优化

1.哪些维度可以进行数据库调优 索引失效、没有充分利用到索引–》索引建立关联查询太多JOIN (设计缺陷或不得已的需求)–》SQL优化服务器调优及各个参数设置(缓冲、线程数等)–》调整my.cnf数据过多–》分库分表 大方向上完全可以分成 物理查询优化和 逻辑查询优化 两大块 物…

记录一次挖矿病毒kthreaddk和rcu_bj,导致CPU飙高处理

htop命令 存在kthreaddk和rcu_bj进程&#xff0c;cpu飙高 占用一般cpu或者70-80% 1、检查定时任务 查看是否有 # crontab -l 检查root账号是否有异常定时任务 有的话crontab -e 修改定时任务保存 并检查所有的用户有没有定时任务( 注&#xff1a;我的是gitlab git账户被入侵)异…

Nginx 配置详解(二)

序言Nginx的代理功能与负载均衡功能是最常被用到的&#xff0c;描述一些关于代理功能的配置&#xff0c;再说明负载均衡详细。Nginx 代理服务的配置说明1、设置 404 页面导向地址error_page 404 https://www.runnob.com; #错误页 proxy_intercept_errors on; #如果被代理服务…

PowerShell Install Mysql 5.7

MySQL介绍 MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。 mysql download Mysql ServerdownloadPowershell 使用使用参数参考 前提条件 开启…

机器学习算法-KNN、决策树

目录1、最近邻算法 KNN1.1 K的选择1.2 案例&#xff1a;鸢尾花2、决策树2.1 决策树介绍2.2 案例&#xff1a;鸢尾花数据2.3 补充1、最近邻算法 KNN 原理&#xff1a;找到K 个与新数据最近的样本&#xff0c;取样本中最多的一个类别作为新数据的类别 要点&#xff1a;距离—是欧…