Leetcode 436. 寻找右区间
1. 问题描述


2. 思路
- 遍历
intervals数组,对于intervals[i]
1.1 查找满足intervals[][0]>=intervals[i][1]的元素对应的索引index
1.2 收集index
1.1中的查找过程,有多种方式,可以线性查找,也可以进行二分查找。如果使用二分查找,需要将
intervals[][0]预先存放到一个新数组中,进行排序,再进行二分查找,由于排序会导致索引发生变化,因此需要另开map来将索引存起来
3. 代码
func findRightInterval(intervals [][]int) []int {
var res []int
array := make([]int, len(intervals))
startMap := make(map[int]int, 0)
for i := 0; i < len(intervals); i++ {
array[i] = intervals[i][0]
startMap[array[i]] = i
}
sort.Ints(array)
for i := 0; i < len(intervals); i++ {
var index int
// 查找intervals[][0]中 >= intervals[i][1]的最小元素
start, ok := binarySearch(array, intervals[i][1])
if !ok { // 如果没有查找到
index = -1
} else {
index = startMap[start]
}
res = append(res, index)
}
return res
}
// 查找有序数组nums中, >= target的最小元素
func binarySearch(nums []int, target int) (int, bool) {
left, right := 0, len(nums) - 1
for left <= right {
mid := left + (right - left) / 2
if nums[mid] == target {
return nums[mid], true
} else if nums[mid] < target {
left = mid + 1
} else {
right = mid - 1
}
}
if left >= len(nums) {
return -1, false
}
return nums[left], true
}
本文介绍了LeetCode第436题的解决方案,重点在于如何遍历和查找区间,使用二分查找优化搜索效率。通过预处理区间起点数组并建立映射,找到每个区间的右边界索引。代码实现包括二分查找函数,最终返回所有区间的右边界索引。

357

被折叠的 条评论
为什么被折叠?



