题目

https://leetcode.com/problems/find-right-interval/

题解

这题考察点不难,就是个普通的二分查找。详细过程是:

因为 start 是唯一的,所以先用 map 存储每一个 start 的对应下标。然后根据 start 的大小,对数组进行排序,方便二分查找。
最后,对于未排序数组中的每一个 end 值,分别在排序好的数组中,找到不小于 end[i] 的第一个元素。需要注意的是,找到的位置不能是 i 本身。

思路很朴素,但是二分查找的细节比较耗时,而且每次都花很长时间在扣边界上。等有时间看下别人的边界的写法。

class Solution {public int[] findRightInterval(int[][] arr) {int L = arr.length;HashMap<Integer, Integer> map = new HashMap<>();map.put(-1, -1);int[] end = new int[L];for (int i = 0; i < L; i++) {end[i] = arr[i][1];map.put(arr[i][0], i);}Arrays.sort(arr, Comparator.comparingInt(o -> o[0])); // start is uniqueint[] result = new int[L];for (int i = 0; i < L; i++) {result[i] = binarySearch(arr, end[i], 0, L - 1, i, map);}return result;}public int binarySearch(int[][] arr, int target, int L, int R, int i, HashMap<Integer, Integer> map) {if (arr[R][0] < target) return -1;// 只看(start,?),找第一个start不小于target的位置while (L < R) {int M = L + ((R - L) >> 1);if (arr[M][0] == target) {return map.get(arr[M][0]);} else if (arr[M][0] < target) {L = M + 1;} else {// 保右端点if (R == M) return map.get(arr[M][0]);R = M;}}if (map.get(arr[L][0]) == i) L += 1; // 目标位置不能是i位置本身if (L >= arr.length) return -1;else return map.get(arr[L][0]);}
}

leetcode 436. Find Right Interval | 436. 寻找右区间(二分查找不小于某值的第一个位置)相关推荐

  1. Leetcode 436.寻找右区间

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

  2. 经典算法之右边界二分查找法(俗称基本右边界二分搜索法)

    经典算法之右边界二分查找法(俗称基本右边界二分搜索法) 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 经典算法之右边界二分查找法(俗称基本右边界二分搜索法) 前言 一.什 ...

  3. LeetCode 528. 按权重随机选择(前缀和+二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 ...

  4. LeetCode 410. 分割数组的最大值(极小极大化 二分查找 / DP)

    文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 DP 1. 题目 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组. 设计一个算法使得这 m 个子数组各自和 ...

  5. LeetCode 875. 爱吃香蕉的珂珂(二分查找)

    1. 题目 珂珂喜欢吃香蕉.这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉.警卫已经离开了,将在 H 小时后回来. 珂珂可以决定她吃香蕉的速度 K (单位:根/小时).每个小时,她将会选 ...

  6. LeetCode LCP 12. 小张刷题计划(二分查找)

    1. 题目 为了提高自己的代码能力,小张制定了 LeetCode 刷题计划,他选中了 LeetCode 题库中的 n 道题,编号从 0 到 n-1,并计划在 m 天内按照题目编号顺序刷完所有的题目(注 ...

  7. LeetCode 162. 寻找峰值(二分查找)

    1. 题目 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返回任何一 ...

  8. [Leedcode][JAVA][第287题][寻找重复数][HashSet][二分查找][快慢指针]

    [问题描述][中等] 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数.输入: ...

  9. LeetCode力扣刷题——居合斩!二分查找

    二分查找 一.算法解释         二分查找也常被称为二分法或者折半查找,每次查找时通过将待查找区间分成两部分并只取 一部分继续查找,将查找的复杂度大大减少.对于一个长度为 O ( n ) 的数组 ...

最新文章

  1. Java8 Stream流递归,几行代码搞定遍历树形结构
  2. bzoj2054 疯狂的馒头
  3. 在VMware环境Windows server 2003下测试磁盘阵列实验
  4. 第 6 期 Arthas 征文活动开启!(内附第 5 期获奖名单)
  5. 【C++深度剖析教程29】C++对象模型分析下
  6. android 添加so,Android studio 中添加 .so 文件
  7. Python中“if __name__=='__main__':”理解与总结
  8. 【OpenCV 例程200篇】42. 图像的灰度变换(比特平面分层)
  9. javascript md5加密算法
  10. OpenCV中对数组(矩阵)的常用操作
  11. 寻找无向图的关节点(Articulation Points)和判断图是否是双连通图(Biconnect Graph)
  12. [C++面试题]之冒泡排序
  13. mysql双主配置及其注意事项
  14. 百度的实时搜索架构分析
  15. 人型自走输入法(网页日语输入法)
  16. Boost常用库介绍
  17. python tkinter canvas
  18. 十分钟教你写个软件防火墙!powershell。
  19. 净水器哪个牌子好,家庭必备电器推荐
  20. available: expected at least 1 bean which qualifies as autowire candidate

热门文章

  1. 牛客 - 树上子链(树的直径-处理负权)
  2. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)
  3. 牛客 - 「土」巨石滚滚(贪心)
  4. EOJ_1020_铁路调度
  5. 华为p4用鸿蒙系统吗_华为正式发布鸿蒙OS Beta版,网友:荣耀还能用上鸿蒙吗
  6. PollardRho大整数分解
  7. GROUP BY 子句中 选择列表中的列无效,因为该列没有包含在聚合函数或
  8. HTTP/3 来了,你了解它么?
  9. C语言实现miniShell
  10. Linxu的常用命令