题目:

给你一个区间数组 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. nginx四层和七层负载的配置

    四层负载和七层负载是两种不同类型的负载均衡策略,它们分别在网络的不同层次上工作.在Nginx中,这两种负载均衡策略可以通过配置nginx.conf文件来实现. 四层负载(L4 Load Balanci ...

  2. 手撕fft系列之频移fftshift源码解析

    壹: fft在数字信号处理领域是一个神一样的存在.要好好熟悉一下.这里给出频移的算法源码解析. 所谓的频移,就是把数字信号的频频顺序打乱,移动一些.这个在防止啸叫和辅听领域应用十分广泛. 贰: 这个源 ...

  3. python3 Crypto模块实例解析

    一 模块简介 1.简介 python的Crypto模块是安全hash函数(例如SHA256 和RIPEMD160)以及各种主流的加解密算法的((AES, DES, RSA, ElGamal等)的集合. ...

  4. 基于BES2500芯片的方案开发总结和反思

    前记   虽然蓝牙芯片现在非常多,可是一旦想做一些差异化的产品时候,能用的非常少.在和客户的反复斟酌中,最终选择了BES2500来开发这款新的产品.这里面是基于自身的实力,产品定位和芯片诉求多重考量的 ...

  5. Linux快速入门(二)Linux基础操作

    绝对路径和相对路径 Linux中绝对路径指从根目录开始,即/目录. 相对路径是指相对于当前路径开始,即./ 目录,../表示上一级目录路径. pwd pwd命令用于查看当前所在目录. gubeiqin ...

  6. 如何从容的打包上传图片对象--File,Blob,BASE64详解及转换方法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 File() File() 构造器创建新的 File 对象实例. 语法 var myFile = new File(bits, name[ ...

  7. KingbaseES 等待事件之 - Client ClientWrite

    等待事件含义 Client:ClientWrite等待事件指数据库等待向客户端写入数据. 在正式业务系统中,客户端必然和数据库集群之间有数据交互,这里指的是数据接收,发送.数据库集群在向客户端发送更多 ...

  8. HashMap对key或value进行排序--Java--小白必懂2

    HashMap对key进行排序 public static void main (String[]args){ HashMap<String, Integer> map = new Has ...

  9. NET Core使用Grpc通信(一):一元

    gRPC是一个现代的开源高性能远程过程调用(RPC)框架,它可以高效地连接数据中心内和跨数据中心的服务,支持负载平衡.跟踪.运行状况检查和身份验证. gRPC通过使用 Protocol Buffers ...

  10. 算法学习笔记【5】| ST表

    ST表 Part 1:ST表解决的问题是什么 ST 表可以用来解决RMQ(区间最值问题)等可重复贡献的问题. ST表基于倍增的思想来实现. Part 2:ST表的实现 ST表通过 O(nlog⁡n)& ...