leetcode题刷250天(78)——436. 寻找右区间(二分查找)

给你一个区间数组 intervals ,其中 intervals[i] = [starti, endi] ,且每个 starti 都 不同 。
区间 i 的 右侧区间 可以记作区间 j ,并满足 startj >= endi ,且 startj 最小化 。
返回一个由每个区间 i 的 右侧区间 的最小起始位置组成的数组。
如果某个区间 i 不存在对应的 右侧区间 ,则下标 i 处的值设为 -1 。

解题思路:
简单来说就是把所有区间的左侧端点值加入一个list,并且能够保存其顺序位次信息
遍历所有的右侧端点值,二分查找是否存在一个值在start序列大于等于其值
有——加入位置信息 || 没有——-1

class Solution(object):
    def findRightInterval(self, intervals):

        def binarySearch(nums, target):
            left, right = 0, len(nums)-1

            while left <= right:
                mid = left + (right-left)//2
                if target == nums[mid]:
                    return target
                elif target > nums[mid]:
                    left = mid + 1
                elif target < nums[mid]:
                    right = mid - 1
                else:
                    pass
        
            if left >= len(nums):
                return -1314
            return nums[left]


        res = []
        starts, ends = [], []
        for i in intervals:
            starts.append(i[0])
            ends.append(i[1])
        # print(starts)

        dic = {}
        for i in range(len(starts)):
            dic[starts[i]] = i

        starts.sort()    
        for i in range(len(ends)):
            flag = binarySearch(starts, ends[i])
            if flag == -1314:
                res.append(-1)
            else:
                res.append(dic[flag])

        return res


            


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值