【二分查找】【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++**实现。

相关文章
|
19天前
leetcode-153:寻找旋转排序数组中的最小值
leetcode-153:寻找旋转排序数组中的最小值
22 0
|
8月前
【Leetcode -1609.奇偶树 -1122.数组的相对排序】
【Leetcode -1609.奇偶树 -1122.数组的相对排序】
29 0
|
19天前
|
机器学习/深度学习 算法 测试技术
【单调栈】3113. 边界元素是最大值的子数组数目
【单调栈】3113. 边界元素是最大值的子数组数目
|
8月前
【LeetCode】1609. 奇偶树、1122. 数组的相对排序
1609. 奇偶树 1609. 奇偶树 题目描述:
32 0
|
19天前
|
存储 索引
每日一题——寻找右区间(排序 + 二分查找)
每日一题——寻找右区间(排序 + 二分查找)
|
19天前
|
算法 测试技术 C#
C++二分查找或并集查找:交换得到字典序最小的数组
C++二分查找或并集查找:交换得到字典序最小的数组
|
19天前
leetcode-57:插入区间
leetcode-57:插入区间
39 0
|
19天前
|
C++
汇总区间(C++)
汇总区间(C++)
26 0
|
19天前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
33 0
|
6月前
|
算法 测试技术 C#
C++ 算法:区间和的个数
C++ 算法:区间和的个数