题目:

给你一个区间数组 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. C#中的MySqlHelper工具类及使用方法

    工具类 工具类转自C# MysqlHelper C#连接mysql数据库类库全,代码如下: using MySql.Data.MySqlClient; using System; using Syst ...

  2. 在Linux平台使用wps卡顿现象解决方法

    是因为软件占据的内存过多,需要关掉目前不使用的软件,以释放系统内存.

  3. use shell scrpit to jlink download bin file

    一 JLINK 下载 JLINK作为一个arm的调试工具,是很多基于arm芯片无法绕过去的调试和下载工具.这里有一个问题,就是该工具链接和使用需要的命令特别多,假如不做成脚本,会浪费很多时间,笔者花了 ...

  4. HiSi 3516CV500 NNIE(Neural Network Inference Engine) 摸鱼记录(2) --- 模型生成及模型仿真(实例分析)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  5. 低代码平台前端的设计与实现(三)设计态画布DesignCanvas的设计与实现

    上一篇文章,我们分析并设计了关于构建引擎BuildEngine的切面设计.本文我们将基于BuildEngine所提供的切面处理能力,在CustomCreateElementHandle中通过一些逻辑, ...

  6. MySQL系列:索引失效场景总结

    相关文章 数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩 ...

  7. 常用命令--复制-备份--cp--mv--scp--rsync

    常用命令--复制-备份--cp--mv--scp--rsync cp cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在 ...

  8. 三维模型3DTile格式轻量化压缩文件大小的技术方法研究

    三维模型3DTile格式轻量化压缩文件大小的技术方法研究 倾斜摄影三维模型,由于数据量大.复杂度高,轻量化压缩成为其在网络传输和实时渲染中必不可少的环节.以下是几种常用的3DTile格式轻量化压缩技术 ...

  9. PLC与上位机传递数据

    1.我这里使用的是HslCommunication 假如传递的是word类型,PLC以16进制封装数组,它有预留,我扩充 PLC博图上是 word[5] 上位机接收 ushort[] Data1=ne ...

  10. 更智能的广告素材生成!看A/B测试如何驱动AIGC素材调优

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 前言:AIGC大爆发,引发广告营销行业变革 ChatGPT等AI产品引发的AIGC大爆发引起了各行业的震动,其中以 ...