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

文章介绍了如何使用二分查找算法解决LeetCode题目436,即在一个区间数组中找到每个区间右侧满足条件的最小起始点的下标,若不存在则返回-1。作者提供了C++代码实现和测试用例。
摘要由CSDN通过智能技术生成

本文涉及的基础知识点

二分查找算法合集

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++**实现。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闻缺陷则喜何志丹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值