题目:

给你一个区间数组 intervals ,其中 intervals[i] = [starti, endi] ,且每个 starti 都 不同 。

区间 i 的 右侧区间 可以记作区间 j ,并满足 startj >= endi ,且 startj 最小化 。

返回一个由每个区间 i 的 右侧区间 在 intervals 中对应下标组成的数组。如果某个区间 i 不存在对应的 右侧区间 ,则下标 i 处的值设为 -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 * 104
  • intervals[i].length == 2
  • -106 <= starti <= endi <= 106
  • 每个间隔的起点都 不相同

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-right-interval
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

【二分查找】

首先理解一下题目的意思:

给了一个区间数组 intervals ,数组中的每个元素都是一个区间,且每个 区间的starti 都 不同。当区间B的起点大于等于区间A的终点,就称区间B在区间A的右侧。让我们求满足右侧区间的,起点最小的那个区间所在区间数组intervals的下标。

这里就是在某个区间找一个目标值,就会想到用二分查找法,但是二分查找法 是在有序数组中查找。加之提示中说了每个区间是start都不一样,可以试试把每个区间的start提取出来,存入到start数组中,并将start数组进行升序排序,并把每个区间的start以  <值,区间下标索引>  键值对的形式存放在一个hashmap start_map中。然后升序排序数组中使用二分查找,将每个区间的end值(target)与start数组中的mid值进行比较,最终在二分查找方法中返回满足条件的start中的下标值:

  • left = 0, right = start.length, mid = left + (right - left) / 2,循环的条件是: left < right;
  • 如果 start[start.length - 1] < target :说明任何区间的起点值都小于当前区间的end值,则找不到右侧区间,直接返回-1;
  • 如果 start[mid]  >=  target :说明起点值大于等于当前区间的end值,则右边的起点值就不是第一个大于end的,则需要往左边搜索,但是mid有可能就是第一个满足条件的start值,即让right = mid;
  • 如果 start[mid]  < target :说明起点值小于当前区间的end值,满足条件的起点值一定在右侧,则需要往右边搜索,即让left = mid + 1;
  • 循环结束的条件:left = right,left或者right都是满足条件的最小起点值。

二分查找返回了符合右侧区间中start下标索引值,根据下标索引值从start数组中获取对应的start值,然后再在start_map中获取start值对应的区间下标存入到ans数组中,最终返回ans即可。

java代码:

 1 class Solution {
2 public int[] findRightInterval(int[][] intervals) {
3 int n = intervals.length;
4 Map<Integer, Integer> start_map = new HashMap<>();
5 //存放每个区间的start
6 int[] start = new int[n];
7 for (int i = 0; i < n; i++){
8 start_map.put(intervals[i][0], i);
9 start[i] = intervals[i][0];
10 }
11 Arrays.sort(start);
12 int[] ans = new int[n];
13 for (int i = 0; i < n; i++){
14 int temp = right_find(start, intervals[i][1]);
15 ans[i] = temp == -1 ? -1 : start_map.get(start[temp]);
16 }
17 return ans;
18 }
19 public int right_find(int[] start, int target){
20 //如果终点大于所有的起点,则找不到右区间
21 if (target > start[start.length - 1]) return -1;
22 int left = 0, right = start.length - 1;
23 while (left < right){
24 int mid = left + (right - left) / 2;
25 //如果起点大于等于终点
26 //则右边的数不是第一个大于终点的数,向左移
27 if (start[mid] >= target){
28 right = mid;
29 }else{
30 left = mid + 1;
31 }
32 }
33 return left;
34 }
35 }

python3代码:

 1 class Solution:
2 def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
3 n = len(intervals)
4 start = []
5 dict = {}
6 for i in range(n):
7 dict[intervals[i][0]] = i
8 start.append(intervals[i][0])
9 start.sort()
10 ans = [0] * n
11 for i in range(n):
12 temp = self.right_find(start, intervals[i][1])
13 ans[i] = -1 if temp == -1 else dict[start[temp]]
14 return ans
15
16 def right_find(self, start, target):
17 n = len(start)
18 left, right = 0, n-1
19 if start[n-1] < target:
20 return -1
21 while left < right:
22 mid = left + (right - left) // 2
23 if start[mid] >= target:
24 right = mid
25 else:
26 left = mid + 1
27 return left

力扣436(java&python)-寻找右区间(中等)的更多相关文章

  1. Java实现 LeetCode 436 寻找右区间

    436. 寻找右区间 给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的"右侧". 对于任何区间,你需要存 ...

  2. Leetcode 436.寻找右区间

    寻找右区间 给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的"右侧". 对于任何区间,你需要存储的满足条 ...

  3. 436. 寻找右区间--LeetCode_二分

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-right-interval 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出 ...

  4. 436. 寻找右区间--LeetCode_暴力

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-right-interval 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出 ...

  5. 436 Find Right Interval 寻找右区间

    给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”.对于任何区间,你需要存储的满足条件的区间 j 的最小索引,这意味着 ...

  6. [Swift]LeetCode436. 寻找右区间 | Find Right Interval

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  7. 力扣(LeetCode)寻找数组的中心索引 个人题解

    给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和. 如果数组不存在中心索引,那么我 ...

  8. 【LeetCode】寻找右区间

    [问题] 给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”. 对于任何区间,你需要存储的满足条件的区间 j 的最小索 ...

  9. 力扣Leetcode 199. 二叉树的右视图

    199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, ...

  10. 力扣 -- 寻找两个有序数组的中位数 Median of Two Sorted Arrays python实现

    题目描述: 中文: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums ...

随机推荐

  1. 关于Sql server数据类型HierarchyID 数据类型用法和递归显示完整路径

    SQL Server 2008版本之后的新类型HierarchyID 不知道大家有没有了解, 该类型作为取代id, parentid的一种解决方案,让人非常惊喜. 官方给的案例浅显易懂,但是没有实现我 ...

  2. STM32 USB协议和代码分析

    一 前言: usb接口是一个非常重要的通信接口,它的协议是有些复杂的.作为一个工程师,对usb协议和代码进行分析,是一个必备的素质和技能.最近一个项目用到了USB存储接口,花了不少时间把项目做完之后, ...

  3. 不想dto套dto可以这样写

    之前都是要新建个dto文件的,偶然看到别人这样写,简单记录一下 @Data public class GdtDailyBalanceContent { List<GdtDailyBalanceR ...

  4. 深度观察2024中国系统架构师大会(SACC)

    今年的中国系统架构师大会(SACC)在我所在的城市广州举办,很荣幸受邀参加.这次能接触到国内最优秀的架构师,学习他们的架构思想和行业经验.对我而言非常有意义. 大会分为上下午共4场,我参加了上午的多云 ...

  5. 记录--uniapp 使用原生子窗体进行视频聊天

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 现在 uniapp 开发的实时音视频聊天类的 APP 大部分都要在 nvue 页面上进行开发.虽然 nvue 与 vue 的区别不是很大, ...

  6. [.NET项目实战] Elsa开源工作流组件应用(三):实战演练

    补充 之前的文章简单介绍了工作流和Elsa工作流库,这里再补充说明两点 工作流的使用场景非常广泛,几乎涵盖了所有需要进行业务流程自动化管理的领域. 学习一个开源库,最简单的方法就是看源码,Elsa的工 ...

  7. dbvisivuser连oracle数据库报错没有权限

    原因:数据库从11g升级为19c了 解决:ojdbc.jar也要换成最新的,导致报错的旧jar包2M大小,换成新jar包3M大小.替换jar包要将 dbvisivuser的tool driverMan ...

  8. 快速上手系列:JavaScript

    第一章 基础语法 1 javascript 的简介 * 是基于对象和事件驱动的语言,应用于客户端. - 基于对象: ** 提供好了很多对象,可以直接拿过来使用 - 事件驱动: ** html 做网站静 ...

  9. PostgreSQL 函数稳定性在索引与全表访问下的性能差异

    一.构建测试数据 create or replace function test_volatile(id integer) returns bigint volatile language sql a ...

  10. Python爬虫爬取国家统计局网站【统计用区划和城乡划分代码】并存入MySQL数据库

    国家统计局网站相关分级页面截图 基本思路 爬取每个页面的a标签内容,生成省市两级数据字典,最后合成区县对应的链接,爬取第三层区划代码和名字,结合省市两级名字生成最后的标准. 代码 1 import p ...