热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode436:寻找右侧区间

本题提供了一个区间数组intervals,其中每个区间intervals[i]包含两个整数[starti,endi],并且所有starti值各不相同。任务是找到每个区间的右侧区间,即存在一个区间j满足startj>=endi并且startj是尽可能小的。返回一个数组,该数组包含每个区间右侧区间的索引;如果没有合适的右侧区间,则返回-1。

题目描述

给定一个区间数组 intervals,其中每个区间 intervals[i] = [starti, endi],且每个 starti 值都是唯一的。定义区间 i 的右侧区间为另一个区间 j,需满足 startj >= endi,同时 startj 应尽可能小。返回一个数组,该数组包含每个区间 i 的右侧区间在 intervals 中的索引。若某区间无对应的右侧区间,则该位置应设为 -1。

示例

示例 1

输入:intervals = [[1,2]]
输出:[-1]
解释:仅有一个区间,因此输出 -1。

示例 2

输入:intervals = [[3,4],[2,3],[1,2]]
输出:[-1,0,1]
解释:对于 [3,4] 不存在符合条件的右侧区间;对于 [2,3],最右侧的区间是 [3,4];对于 [1,2],最右侧的区间是 [2,3]。

示例 3

输入:intervals = [[1,4],[2,3],[3,4]]
输出:[-1,2,-1]
解释:对于 [1,4] 和 [3,4],没有符合条件的右侧区间;对于 [2,3],最右侧的区间是 [3,4]。

约束条件

1 <= intervals.length <= 2 * 10^4
intervals[i].length == 2
-10^6 <= starti <= endi <= 10^6
每个区间的起点都各不相同。

解题思路

解决此类寻找首个大于或等于特定值的问题时,二分查找是一种高效的方法。由于问题要求的是找到值而非具体数值,我们需要创建一个新的数组来存储所有区间的起点及其原始索引,然后对这个新数组进行排序。之后,通过二分查找来定位每个区间右侧区间的索引。

解决方案代码

Java 实现
class Solution {
public int[] findRightInterval(int[][] intervals) {
int n = intervals.length;
int[] result = new int[n];
int[][] starts = new int[n][2];
for (int i = 0; i starts[i][0] = intervals[i][0];
starts[i][1] = i;
}
Arrays.sort(starts, (a, b) -> a[0] - b[0]);
for (int i = 0; i result[i] = binarySearch(starts, intervals[i][1]);
}
return result;
}
private int binarySearch(int[][] starts, int target) {
int left = 0, right = starts.length - 1, answer = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (starts[mid][0] >= target) {
answer = starts[mid][1];
right = mid - 1;
} else {
left = mid + 1;
}
}
return answer;
}
}

在编程和算法设计中,保持谦逊的态度,勇于面对挑战。


推荐阅读
  • C# LiNQ 查询 join连接
    C# LiNQ 查询 join连接 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 本文介绍如何使用 Python 的 xlrd 库读取 Excel 文件,并将其数据处理后存储到数据库中。通过实际案例,详细讲解了文件路径、合并单元格处理等常见问题。 ... [详细]
  • 本文详细介绍了Java中的三大类设计模式:创建型模式、结构型模式和行为型模式,并探讨了设计模式遵循的六大原则,帮助开发者更好地理解和应用这些模式。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • Java 数组及其常用操作
    本文详细介绍了 Java 中的数组类型、定义方法以及常见操作,帮助开发者更好地理解和使用 Java 数组。 ... [详细]
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • Qt中QSpinBox与QSlider的联动实现
    本文介绍如何在Qt框架下将QSpinBox和QSlider组件进行联动,使用户在拖动滑块或修改文本框中的数值时,两个组件能同步更新,从而提供更加直观和便捷的用户体验。 ... [详细]
  • 本文介绍了如何使用Java中的同步方法和同步代码块来实现两个线程的交替打印。一个线程负责打印1到52的数字,另一个线程负责打印A到Z的字母,确保输出顺序为12A34B...5152Z。 ... [详细]
  • 区块链赋能新零售:提升线下溯源防伪体验,保障线上消费安全
    通过区块链技术的应用,实现产品全流程溯源和防伪,为消费者提供更安全、放心的线上线下购物体验。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
  • 在进行Revit插件开发时,经常会遇到窗口被其他应用程序遮挡的问题。本文将介绍如何通过简单的代码调整,确保插件窗口始终保持在Revit主界面的最前端,提升用户体验。 ... [详细]
author-avatar
哇哈哈啦啦啦啦_729
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有