数据结构与算法之 leetcode 二分查找变形 查找左边界 / 右边界

数据结构与算法阿木 发布于 8 天前 2 次阅读


摘要:

二分查找是一种高效的算法,常用于解决有序数组中的查找问题。在LeetCode等编程竞赛平台中,二分查找的变形问题尤为常见,如查找左边界和右边界。本文将深入探讨二分查找的原理,并针对查找左边界和右边界的问题,提供详细的代码实现和分析。

一、

二分查找是一种在有序数组中查找特定元素的算法,其基本思想是将数组分成两半,根据目标值与中间值的比较结果,决定在左半部分还是右半部分继续查找。二分查找的时间复杂度为O(log n),在处理大量数据时具有显著优势。

二、二分查找原理

二分查找的基本步骤如下:

1. 确定数组的起始位置(low)和结束位置(high)。

2. 计算中间位置(mid)。

3. 比较目标值与中间位置的元素:

- 如果目标值等于中间位置的元素,则查找成功。

- 如果目标值小于中间位置的元素,则在左半部分继续查找。

- 如果目标值大于中间位置的元素,则在右半部分继续查找。

4. 重复步骤2和3,直到找到目标值或low大于high。

三、查找左边界

查找左边界是指在有序数组中找到第一个等于目标值的元素的位置。以下是一个查找左边界的代码实现:

python

def find_left_boundary(nums, target):


low, high = 0, len(nums) - 1


while low <= high:


mid = (low + high) // 2


if nums[mid] < target:


low = mid + 1


elif nums[mid] > target:


high = mid - 1


else:


if mid == 0 or nums[mid - 1] != target:


return mid


high = mid - 1


return -1


分析:

- 当nums[mid]等于target时,需要判断是否为左边界。如果mid为0或nums[mid - 1]不等于target,则mid为左边界。

- 如果nums[mid]小于target,则将low更新为mid + 1,继续在右半部分查找。

- 如果nums[mid]大于target,则将high更新为mid - 1,继续在左半部分查找。

四、查找右边界

查找右边界是指在有序数组中找到最后一个等于目标值的元素的位置。以下是一个查找右边界的代码实现:

python

def find_right_boundary(nums, target):


low, high = 0, len(nums) - 1


while low <= high:


mid = (low + high) // 2


if nums[mid] < target:


low = mid + 1


elif nums[mid] > target:


high = mid - 1


else:


if mid == len(nums) - 1 or nums[mid + 1] != target:


return mid


low = mid + 1


return -1


分析:

- 当nums[mid]等于target时,需要判断是否为右边界。如果mid为len(nums) - 1或nums[mid + 1]不等于target,则mid为右边界。

- 如果nums[mid]小于target,则将low更新为mid + 1,继续在右半部分查找。

- 如果nums[mid]大于target,则将high更新为mid - 1,继续在左半部分查找。

五、总结

本文深入探讨了二分查找的原理,并针对查找左边界和右边界的问题,提供了详细的代码实现和分析。通过理解二分查找的变形问题,我们可以更好地掌握二分查找算法,并在实际编程中灵活运用。

在LeetCode等编程竞赛平台中,二分查找的变形问题经常出现。通过熟练掌握查找左边界和右边界的技巧,我们可以更快地解决这类问题,提高编程能力。希望本文对您有所帮助。