力扣436(java&python)-寻找右区间(中等)
题目:
给你一个区间数组 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)-寻找右区间(中等)的更多相关文章
- Java实现 LeetCode 436 寻找右区间
436. 寻找右区间 给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的"右侧". 对于任何区间,你需要存 ...
- Leetcode 436.寻找右区间
寻找右区间 给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的"右侧". 对于任何区间,你需要存储的满足条 ...
- 436. 寻找右区间--LeetCode_二分
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-right-interval 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出 ...
- 436. 寻找右区间--LeetCode_暴力
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-right-interval 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出 ...
- 436 Find Right Interval 寻找右区间
给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”.对于任何区间,你需要存储的满足条件的区间 j 的最小索引,这意味着 ...
- [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 ...
- 力扣(LeetCode)寻找数组的中心索引 个人题解
给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和. 如果数组不存在中心索引,那么我 ...
- 【LeetCode】寻找右区间
[问题] 给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”. 对于任何区间,你需要存储的满足条件的区间 j 的最小索 ...
- 力扣Leetcode 199. 二叉树的右视图
199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, ...
- 力扣 -- 寻找两个有序数组的中位数 Median of Two Sorted Arrays python实现
题目描述: 中文: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums ...
随机推荐
- husky 7.0.4 git hooks 前端 commit 钩子 git转svn [已解决]
husky 7 的安装,注意下版本 第一步 安装 cnpm install husky@7.0.4 --save-dev 第二步 在package.json script加入 "prepar ...
- SourceTree 摘樱桃 === 遴选 [不要使用这个功能!!不要使用!不要使用!]
SourceTree 摘樱桃 === 遴选 不要使用摘樱桃!!不要使用!不要使用! 我找了一个文本的git,进行的测试,发现很不好用,文档我又恢复过来了,因为就改了几个字,代码的话,会造成 不可挽回的 ...
- 深入浅出Java多线程(十二):线程池
引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十二篇内容:线程池.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在现代软件开发中,多线程编程已经成为应对 ...
- Android使用poi遇到的问题
原文:Android使用poi遇到的问题 关于Poi使用可以看这一篇[开源库推荐]#4 Poi-办公文档处理库 本篇主要讲些在Android上使用出现的问题 问题 原本是需要一个导出xlsx表格文件的 ...
- Android13源码下载环境搭建
由于AOSP的下载&编译等工作,需要用到git与python的支持,所以需要提前安 装好 VMware解决Ubuntu不占满全屏问题和Windows复制粘贴问题 https://blog.cs ...
- 【Unity干货教程】如何实现Unity和Android原生互相调用?
Unity是一个跨平台开发工具,发布到移动平台也是大部分Unity开发者的必备技能.而由于Unity跨平台的特性,总会遇到在移动平台的技术细节支持不够,或者需要在调用其他原生插件的情况.这里我们说一下 ...
- 关于云XR介绍,以及5G时代云化XR的发展机遇
XR技术进入全面沉浸化时代 基于云化XR技术将大幅降低XR终端设备的计算负荷和能耗,摆脱线缆的束缚,XR终端设备将变得更轻.更沉浸.更智能.更有利于商业化. 网络XR终端能力的提升,将推动XR技术进入 ...
- Walrus 0.6发布:预览资源变更、丰富公有云支持,满足企业多云需求
近日,数澈软件Seal(以下简称"Seal")宣布基于 IaC 的开源应用管理平台 Walrus 0.6 正式发布! 在之前的版本中,Walrus 引入应用模型并优化了应用部署体验 ...
- Python编程规范+最佳实践
前言 Python之禅是影响Python编程语言设计的19条原则,也是Python编码规范的核心理念. 优美胜于丑陋(Python 以编写优美的代码为目标) 明了胜于晦涩(优美的代码应当是明了的,命名 ...
- vue2(脚手架、组件)
2.1 脚手架 使用前置: 第一步(没有安装过的执行):全局安装 @vue/cli npm install -g @vue/cli 第二步:切换到要创建项目的目录,然后使用命令创建项目 vue cre ...