区间合并计算问题(LC-1326、LC-1024、LC-55、LC-45)

news2025/7/14 7:53:02

区间合并计算问题

文章目录

  • 区间合并计算问题
    • [1326. 灌溉花园的最少水龙头数目](https://leetcode.cn/problems/minimum-number-of-taps-to-open-to-water-a-garden/)
      • 贪心
    • [1024. 视频拼接](https://leetcode.cn/problems/video-stitching/)
    • [55. 跳跃游戏](https://leetcode.cn/problems/jump-game/)
    • [45. 跳跃游戏 II](https://leetcode.cn/problems/jump-game-ii/)
      • 法一:动态规划
      • 法二:贪心

1326. 灌溉花园的最少水龙头数目

难度困难128

在 x 轴上有一个一维的花园。花园长度为 n,从点 0 开始,到点 n 结束。

花园里总共有 n + 1 个水龙头,分别位于 [0, 1, ..., n]

给你一个整数 n 和一个长度为 n + 1 的整数数组 ranges ,其中 ranges[i] (下标从 0 开始)表示:如果打开点 i 处的水龙头,可以灌溉的区域为 [i - ranges[i], i + ranges[i]]

请你返回可以灌溉整个花园的 最少水龙头数目 。如果花园始终存在无法灌溉到的地方,请你返回 -1

示例 1:

img

输入:n = 5, ranges = [3,4,1,1,0,0]
输出:1
解释:
点 0 处的水龙头可以灌溉区间 [-3,3]
点 1 处的水龙头可以灌溉区间 [-3,5]
点 2 处的水龙头可以灌溉区间 [1,3]
点 3 处的水龙头可以灌溉区间 [2,4]
点 4 处的水龙头可以灌溉区间 [4,4]
点 5 处的水龙头可以灌溉区间 [5,5]
只需要打开点 1 处的水龙头即可灌溉整个花园 [0,5] 。

示例 2:

输入:n = 3, ranges = [0,0,0,0]
输出:-1
解释:即使打开所有水龙头,你也无法灌溉整个花园。

提示:

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

贪心

https://leetcode.cn/problems/minimum-number-of-taps-to-open-to-water-a-garden/solution/java-tong-yong-de-yi-wei-qu-jian-jiao-bi-qfn0/

leetcode上一维的区间合并计算问题种类很多,但是大都是一个套路,起点排序,然后通过贪心的方法,进行具体分析;

这里先将水龙头位置信息转化为其有效工作区间信息;

然后根据区间的左端点进行升序;

最后枚举所有区间,通过贪心思想,获得可覆盖当前有效区间的最右区间。

class Solution {
    public int minTaps(int n, int[] ranges) {
        // 定义一个区间数组
        int[][] region = new int[n+1][2];
        // 将原来的水龙头位置信息转化为洒水区间信息
        for(int i = 0; i <= n; i++){
            int[] tmp = new int[2];
            tmp[0] = Math.max(0, i - ranges[i]);
            tmp[1] = Math.min(n, i + ranges[i]);
            region[i] = tmp;
        }
        // 以左端点为标准进行升序
        Arrays.sort(region, (a,b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);
        // 初始化答案,当前可用最右位置
        int res = 0, right = 0;
        // 初始化当前区间
        int cur = 0;
        // 遍历所有区间
        while(cur < n+1){
            // 当前区间无法覆盖到最右的有效工作范围,那么就会存在覆盖不到的间隙
            if(region[cur][0] > right) break;
            // 遍历可以覆盖到已经可用的最右点的下一个可用的最右边点
            int rt = right;
            while(cur < n+1 && region[cur][0] <= right){
                rt = Math.max(rt, region[cur][1]);
                cur++;
            }
            res++;
            right = rt;
            if(right == n) break;
        }
        return right == n ? res : -1;
    }
}

0x3f:

class Solution {
    public int minTaps(int n, int[] ranges) {
        int[] rightMost = new int[n+1];
        for(int i = 0; i <= n; i++){
            int r = ranges[i];
            if(i > r) rightMost[i-r] = i+r; // 对于 i-r 来说,i+r 必然是它目前的最大值
            else rightMost[0] = Math.max(rightMost[0], i+r);
        }
        int res = 0;
        int curRight = 0;
        int nextRight = 0;
        for(int i = 0; i < n; i++){
            nextRight = Math.max(nextRight, rightMost[i]);
            if(i == curRight){
                // 到达已建造的桥的右端点
                if(i == nextRight) return -1;// 无论怎么造桥,都无法从 i 到 i+1
                curRight = nextRight;// 造一座桥
                res++;
            }
        }
        return res;
    }
}

1024. 视频拼接

难度中等317

你将会获得一系列视频片段,这些片段来自于一项持续时长为 time 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。

使用数组 clips 描述所有的视频片段,其中 clips[i] = [starti, endi] 表示:某个视频片段开始于 starti 并于 endi 结束。

甚至可以对这些片段自由地再剪辑:

  • 例如,片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。

我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, time])。返回所需片段的最小数目,如果无法完成该任务,则返回 -1

示例 1:

输入:clips = [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], time = 10
输出:3
解释:
选中 [0,2], [8,10], [1,9] 这三个片段。
然后,按下面的方案重制比赛片段:
将 [1,9] 再剪辑为 [1,2] + [2,8] + [8,9] 。
现在手上的片段为 [0,2] + [2,8] + [8,10],而这些覆盖了整场比赛 [0, 10]。

示例 2:

输入:clips = [[0,1],[1,2]], time = 5
输出:-1
解释:
无法只用 [0,1] 和 [1,2] 覆盖 [0,5] 的整个过程。

示例 3:

输入:clips = [[0,1],[6,8],[0,2],[5,6],[0,4],[0,3],[6,7],[1,3],[4,7],[1,4],[2,5],[2,6],[3,4],[4,5],[5,7],[6,9]], time = 9
输出:3
解释: 
选取片段 [0,4], [4,7] 和 [6,9] 。

提示:

  • 1 <= clips.length <= 100
  • 0 <= starti <= endi <= 100
  • 1 <= time <= 100
class Solution {
    public int videoStitching(int[][] clips, int time) {
        Arrays.sort(clips, (a,b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);
        int right = 0, cur = 0;
        int res = 0;
        while(cur < clips.length){
            if(clips[cur][0] > right) return -1;
            int rt = right;
            while(cur < clips.length && clips[cur][0] <= right){
                rt = Math.max(rt,clips[cur][1]);
                cur++;
            }
            res++;
            right = rt;
            if(right >= time) break;
        }
        return right >= time ? res : -1;
    }
}

55. 跳跃游戏

难度中等2204

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

示例 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

提示:

  • 1 <= nums.length <= 3 * 104
  • 0 <= nums[i] <= 105
class Solution {
    public boolean canJump(int[] nums) {
        int n = nums.length;
        if(n == 1) return true;
        int right = 0;
        int cur = 0;
        while(cur < n && right < n-1){
            if(right < cur) break; // 怎么走都无法越过cur
            right = Math.max(right, cur + nums[cur]);
            cur++;
        }
        if(right < n-1) return false;
        else return true;
    }
}

45. 跳跃游戏 II

难度中等1966

给定一个长度为 n0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2

提示:

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 1000
  • 题目保证可以到达 nums[n-1]

法一:动态规划

class Solution {
    public int jump(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n+1];
        Arrays.fill(dp, (int)1e5);
        dp[0] = 0;
        for(int i = 0; i < n; i++){
            for(int j = i+1; j <= Math.min(n, i+nums[i]); j++){
                dp[j] = Math.min(dp[j], dp[i] + 1);
            }
        }
        return dp[n-1];
    }
}

法二:贪心

如果我们「贪心」地进行正向查找,每次找到可到达的最远位置,就可以在线性时间内得到最少的跳跃次数。

在具体的实现中,我们维护当前能够到达的最大下标位置,记为边界。我们从左到右遍历数组,到达边界时,更新边界并将跳跃次数增加 1。

class Solution {
    public int jump(int[] nums) {
        int n = nums.length;
        int end = 0;
        int maxPosition = 0;
        int steps = 0;
        for(int i = 0; i < length-1; i++){
            maxPosition = Math.max(maxPosition, i + nums[i]);
            if(i == end){
                end = maxPosition;
                steps++;
            }
        }
        return steps;
    }
}

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

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

相关文章

[JavaEE系列] 详解面试中HTTP协议HTTPS协议

文章目录HTTP不安全HTTPS中的加密算法对称加密非对称加密混合加密HTTPS中的摘要算法HTTPS中的数字证书SSL /TLS握手TCP建立连接&#xff08;三次握手&#xff09;三次握手中常见的面试题&#xff1a;TCP断开连接&#xff08;四次挥手&#xff09;四次挥手中常见的面试题&#x…

比亚迪决定不给日系留“活路”了

本文来源&#xff1a;品驾/ 导读 /比亚迪的战争又打响了。2月10日&#xff0c;比亚迪秦PLUS DM-i2023冠军版正式上市&#xff0c;新车虽然改动不大&#xff0c;但起步价已至99800元&#xff0c;DM-i车型价格首次下探到10万以下这个区间。这场战争有那么可怕吗&#xff1f;有人还…

JSCharting 3.4 JavaScript Crack

JSCharting 利用其 JavaScript 图表库中十多年的真实世界图表和可视化专业知识。JSCharting 拥有超过 150 种图表类型&#xff0c;提供了一整套无缝集成的产品&#xff0c;包括甘特图、组织图表、地图、日历、网格、财务、股票、微型图、迷你图和所有类型的仪表板&#xff0c;用…

【论文简述】SKFlow: Learning Optical Flow with Super Kernels(NeurIPS 2022)

一、论文简述 1. 第一作者&#xff1a;Shangkun Sun 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;NeurIPS 4. 关键词&#xff1a;光流、代价体、遮挡区域、大核卷积、跳跃连接 5. 探索动机&#xff1a;遮挡问题是光流最大的挑战之一。 现有的解决方案&#xff1a…

JavaDoc生成API文档(powernode CD2207)(内含教学视频+源代码)

JavaDoc生成API文档&#xff08;powernode CD2207&#xff09;(内含教学视频源代码) 教学视频源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87473419 目录JavaDoc生成API文档&#xff08;powernode CD2207&#xff09;(内含教学视频源代…

robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动

robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的gazebo仿真环境后&#xff0c;夹爪看起来…

操作系统作业

1、下列关于线程的描述中&#xff0c;错误的是A&#xff0e;内核级线程的调度由操作系统完成B&#xff0e;操作系统为每个用户级线程建立一个线程控制块C&#xff0e;用户级线程间的切换比内核级线程间的切换效率高D&#xff0e;用户级线程可以在不支持内核级线程的操作系统上实…

07- 图像上下采样及图像直方图显示 (OpenCV基础) (机器视觉)

知识重点 高斯金字塔pyrDown向下采样: dst cv2.pyrDown(img) # 每次处理后, 结果图像是原来的1/4.pyrUp 向上采样: dst cv2.pyrUp(img) # 放大图片拉普拉斯金字塔 保留的就是残差: img- PyrUp(PyrDown(img))统计直方图: hist cv2.calcHist([img], [0], None, [25…

element/tree的使用(树的多选以及回显)

获取和设置各有两种方式&#xff1a;通过 node 或通过 key。如果需要通过 key 来获取或设置&#xff0c;则必须设置node-key。 <el-tree:data"data"show-checkboxdefault-expand-allnode-key"id"ref"tree"highlight-current:props"defa…

Oracle格式化五位数字格式时间

首先五位的时间格式一般出现在Excel批量导入时&#xff0c;年月日的时间格式读取时出现可以在excel文件中复现出来&#xff0c;在Excel文件中填写时间格式2023/02/21&#xff0c;然后右键设置单元格格式就选择常规就可以显示为5位的时间格式&#xff0c;也就是说2023/02/21对应…

不要对chatgpt过度反思 第二部分

如果未来&#xff0c;它真的可以引爆下一轮科技革命&#xff0c;只要双方不存在科技代差&#xff0c;就无法阻止科技扩散。 打个比方&#xff0c;如果你本身没有网络基础&#xff0c;没有大数据&#xff0c;她确实和你无关&#xff0c;反之&#xff0c;捅破了那层窗户纸&#x…

5.9 BGP属性-local_pref

配置BGP LOCAL_PREF属性控制选路 1. 实验目的 熟悉BGP LOCAL_PREF属性控制选路的应用场景掌握BGP LOCAL_PREF属性控制选路的配置方法2. 实验拓扑 实验拓扑如图5-9所示: 图5-9:配置BGP LOCAL_PREF属性控制选路 3. 实验步骤 (…

html笔记(一)

一、html简介 什么是HTML&#xff1f; Hyper Text Markup Language 超文本标记语言 超文本&#xff1f;超级文本&#xff0c;例如流媒体&#xff0c;声音、视频、图片等。 标记语言&#xff1f;这种语言是由大量的标签组成。 任何一个标签都有开始标签和结束标签&…

Datawahle组队学习——妙趣横生大数据 Day3

妙趣横生大数据 Day3四、HBase1. 背景2. HBase 概述3. HBase 数据模型相关概念数据坐标概念视图物理视图面向列的存储4. HBase 实现原理HBase 功能组件表和 RegionRegion 定位5. HBase 运行机制系统架构Region服务器的工作原理Store工作原理HLog工作原理实验Datawhale 大数据技…

Redis学习之Jedis(五)

这里写目录标题一、Jedis简介二、Jedis代码实现2.1 新建java工程2.2 导入jar包2.3 编写代码2.4 这里可以换用maven项目三、Jedis简易工具类开发3.1 添加jar包3.2 封装连接参数3.3 加载配置信息3.4 获取连接一、Jedis简介 Jedis提供了Java与Redis的连接服务。 二、Jedis代码实…

Sigmoid和Softmax共通与区分

一、共同点 Softmax以及Sigmoid这两者都是神经网络中的激活函数&#xff0c;将输入非线性化。 都作为神经网络的最后一层&#xff0c;将输出数值转换为概率值。 二、不同点 1、Softmax Softmaxexi∑j1nexjSoftmax \frac{e^{x_{i}}}{\sum_{j1}^{n}e^{x_{j}}} Softmax∑j1n​…

第一章 操作系统概述

目录一、什么是操作系统&#xff1f;1、操作系统的概念2、计算系统的构成3、主要作用二、操作系统有哪些功能&#xff1f;1、操作系统的目标2、操作系统的功能三、操作系统有哪些特征&#xff1f;1、并发性2、共享性3、虚拟性4、异步性四、操作系统的运行机制是怎样的&#xff…

uniapp 实时定位(高德、后台运行、支持息屏、坐标转换、距离计算) Ba-LocationAMap

简介&#xff08;下载地址&#xff09; Ba-LocationAMap 是一款基于高德的定位插件。支持实时定位、后台运行、息屏运行等&#xff1b;支持逆地理地址信息&#xff1b;支持坐标转换&#xff1b;支持坐标转换&#xff1b;支持距离计算&#xff1b;支持电池优化白名单。 本插件…

Pod容器

1、Pod基础概念Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的StatefulSet和…

如何在jmeter中把响应中的数据提取出来并引用

jmeter做接口测试过程中&#xff0c;经常遇到请求需要用到token的时候&#xff0c;我们可以把返回token的接口用后置处理器提取出来&#xff0c;但是在这种情况下&#xff0c;只能适用于当前的线程组&#xff0c;其他线程组无法引用到提取的token变量值&#xff0c;所以必须要生…