【二分查找】【map]436. 寻找右区间

简介: 【二分查找】【map]436. 寻找右区间

本文涉及的基础知识点

二分查找算法合集

LeetCode 436. 寻找右区间

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

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

返回一个由每个区间 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] 有最小的“右”起点。

436.寻找右区间

二分查找

由于starti不相等,所以可以用map 记录starti和i。寻找第一个大于等于endi的i。注意:如果i不能等于j,则寻找第一个大于等于max(endi,starti+1)。

代码

class Solution {
public:
    vector<int> findRightInterval(vector<vector<int>>& intervals) {
        map<int, int> mValueToIndex;
        for (int i = 0 ; i < intervals.size();i++ )
        {
            mValueToIndex[intervals[i][0]] = i;
        }
        vector<int> vRet;
        for (int i = 0; i < intervals.size(); i++)
        {
            auto it = mValueToIndex.lower_bound(intervals[i][1]);
            vRet.emplace_back((mValueToIndex.end() == it) ? -1 : it->second);
        }
        return vRet;
    }
};

测试用例

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
  if (v1.size() != v2.size())
  {
    assert(false);
    return;
  }
  for (int i = 0; i < v1.size(); i++)
  {
    assert(v1[i] == v2[i]);
  }
}
template<class T>
void Assert(const T& t1, const T& t2)
{
  assert(t1 == t2);
}
int main()
{
    vector<vector<int>>  intervals;
    {
        Solution sln;
        intervals = { {1,2} };
        auto res = sln.findRightInterval(intervals);
        Assert(res, { -1 });
    }
    {
        Solution sln;
        intervals = { {3,4},{2,3},{1,2} };
        auto res = sln.findRightInterval(intervals);
        Assert(res, { -1,0,1 });
    }
    {
        Solution sln;
        intervals = { {1,4},{2,3},{3,4} };
        auto res = sln.findRightInterval(intervals);
        Assert(res, { -1,2,-1 });
    }
}


扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。

https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程

https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版

https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境: VS2022 C++17

如无特殊说明,本算法用**C++**实现。

相关文章
【Leetcode -1609.奇偶树 -1122.数组的相对排序】
【Leetcode -1609.奇偶树 -1122.数组的相对排序】
53 0
|
7月前
|
机器学习/深度学习 算法 测试技术
【单调栈】3113. 边界元素是最大值的子数组数目
【单调栈】3113. 边界元素是最大值的子数组数目
|
6月前
|
C++
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
|
7月前
|
机器学习/深度学习 算法 测试技术
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
|
7月前
|
存储 索引
每日一题——寻找右区间(排序 + 二分查找)
每日一题——寻找右区间(排序 + 二分查找)
|
7月前
|
算法 测试技术 C#
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数
|
7月前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
63 0
剑指offer 57. 数组中数值和下标相等的元素
剑指offer 57. 数组中数值和下标相等的元素
113 0
剑指offer 57. 数组中数值和下标相等的元素
|
算法
算法练习——(8)用下标排序
问题:给你n个无序的int整型数组arr,并且这些整数的取值范围都在0-20之间,要你在 O(n) 的时间复杂度中把这 n 个数按照从小到大的顺序打印出来。

热门文章

最新文章