二分查找高效破解旋转数组
搜索旋转排序数组(LeetCode 33)
给定一个旋转后的有序数组和一个目标值,要求确定目标值是否存在于数组中。旋转排序数组的特点是部分有序,可以通过二分查找的变种高效解决。
核心思路:利用二分查找确定有序部分,判断目标值是否在有序范围内。每次将数组分为两部分,至少有一部分是有序的。通过比较中间元素与左右边界,确定目标值所在的区间。
关键步骤:
- 初始化左右指针
left和right。 - 计算中间位置
mid,检查nums[mid]是否等于目标值。 - 若
nums[left] <= nums[mid],说明左半部分有序。若目标值在左半部分范围内,调整右指针;否则调整左指针。 - 若右半部分有序,同理判断目标值是否在右半部分范围内。
代码示例:
def search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
if nums[left] <= nums[mid]:
if nums[left] <= target < nums[mid]:
right = mid - 1
else:
left = mid + 1
else:
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return -1
寻找旋转排序数组中的最小值(LeetCode 153)
在旋转后的有序数组中寻找最小元素。旋转数组的最小值通常位于无序部分的起始点。
核心思路:通过二分查找比较中间元素与右边界元素。若中间元素大于右边界,最小值在右半部分;否则在左半部分。
关键步骤:
- 初始化左右指针
left和right。 - 比较中间元素
nums[mid]与右边界nums[right]。 - 若
nums[mid] > nums[right],最小值在右半部分,调整左指针。 - 否则最小值在左半部分或中间位置,调整右指针。
代码示例:
def findMin(nums):
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] > nums[right]:
left = mid + 1
else:
right = mid
return nums[left]
寻找两个正序数组的中位数(LeetCode 4)
给定两个有序数组,要求找到它们合并后的中位数。时间复杂度需控制在 O(log(min(m, n)))。
核心思路:通过二分查找确定分割线,使得左右两部分元素数量相等或差一。比较分割线两侧元素确保左半部分最大值小于右半部分最小值。
关键步骤:
- 确保第一个数组长度小于第二个数组,以减少查找范围。
- 在较短数组中进行二分查找,确定分割线位置。
- 计算较长数组的分割线位置,使得左右两部分元素数量平衡。
- 比较分割线两侧元素,调整查找范围直至满足条件。
代码示例:
def findMedianSortedArrays(nums1, nums2):
if len(nums1) > len(nums2):
nums1, nums2 = nums2, nums1
m, n = len(nums1), len(nums2)
left, right = 0, m
while left <= right:
partition1 = (left + right) // 2
partition2 = (m + n + 1) // 2 - partition1
max_left1 = float('-inf') if partition1 == 0 else nums1[partition1 - 1]
min_right1 = float('inf') if partition1 == m else nums1[partition1]
max_left2 = float('-inf') if partition2 == 0 else nums2[partition2 - 1]
min_right2 = float('inf') if partition2 == n else nums2[partition2]
if max_left1 <= min_right2 and max_left2 <= min_right1:
if (m + n) % 2 == 0:
return (max(max_left1, max_left2) + min(min_right1, min_right2)) / 2
else:
return max(max_left1, max_left2)
elif max_left1 > min_right2:
right = partition1 - 1
else:
left = partition1 + 1
总结
以上三个问题均涉及二分查找的变种应用,关键在于理解如何通过比较中间元素与边界元素来缩小搜索范围。旋转数组问题需利用部分有序特性,中位数问题则通过分割线平衡两部分元素数量。掌握这些技巧可高效解决类似问题。
BbS.okacop010.info/PoSt/1120_724306.HtM
BbS.okacop011.info/PoSt/1120_496472.HtM
BbS.okacop012.info/PoSt/1120_231741.HtM
BbS.okacop013.info/PoSt/1120_096717.HtM
BbS.okacop014.info/PoSt/1120_576300.HtM
BbS.okacop015.info/PoSt/1120_382279.HtM
BbS.okacop016.info/PoSt/1120_328917.HtM
BbS.okacop017.info/PoSt/1120_097853.HtM
BbS.okacop018.info/PoSt/1120_078916.HtM
BbS.okacop019.info/PoSt/1120_120519.HtM
BbS.okacop010.info/PoSt/1120_823877.HtM
BbS.okacop011.info/PoSt/1120_630745.HtM
BbS.okacop012.info/PoSt/1120_756673.HtM
BbS.okacop013.info/PoSt/1120_040977.HtM
BbS.okacop014.info/PoSt/1120_392583.HtM
BbS.okacop015.info/PoSt/1120_438295.HtM
BbS.okacop016.info/PoSt/1120_813191.HtM
BbS.okacop017.info/PoSt/1120_770193.HtM
BbS.okacop018.info/PoSt/1120_420912.HtM
BbS.okacop019.info/PoSt/1120_890856.HtM
BbS.okacop010.info/PoSt/1120_392768.HtM
BbS.okacop011.info/PoSt/1120_836098.HtM
BbS.okacop012.info/PoSt/1120_667645.HtM
BbS.okacop013.info/PoSt/1120_462299.HtM
BbS.okacop014.info/PoSt/1120_900828.HtM
BbS.okacop015.info/PoSt/1120_979786.HtM
BbS.okacop016.info/PoSt/1120_813798.HtM
BbS.okacop017.info/PoSt/1120_054392.HtM
BbS.okacop018.info/PoSt/1120_743071.HtM
BbS.okacop019.info/PoSt/1120_407757.HtM
BbS.okacop010.info/PoSt/1120_551858.HtM
BbS.okacop011.info/PoSt/1120_790672.HtM
BbS.okacop012.info/PoSt/1120_972496.HtM
BbS.okacop013.info/PoSt/1120_159018.HtM
BbS.okacop014.info/PoSt/1120_070786.HtM
BbS.okacop015.info/PoSt/1120_035328.HtM
BbS.okacop016.info/PoSt/1120_028812.HtM
BbS.okacop017.info/PoSt/1120_242568.HtM
BbS.okacop018.info/PoSt/1120_672217.HtM
BbS.okacop019.info/PoSt/1120_695721.HtM
BbS.okacop010.info/PoSt/1120_253755.HtM
BbS.okacop011.info/PoSt/1120_700537.HtM
BbS.okacop012.info/PoSt/1120_991203.HtM
BbS.okacop013.info/PoSt/1120_569937.HtM
BbS.okacop014.info/PoSt/1120_163359.HtM
BbS.okacop015.info/PoSt/1120_325899.HtM
BbS.okacop016.info/PoSt/1120_720926.HtM
BbS.okacop017.info/PoSt/1120_236725.HtM
BbS.okacop018.info/PoSt/1120_901253.HtM
BbS.okacop019.info/PoSt/1120_927772.HtM
BbS.okacop020.info/PoSt/1120_395961.HtM
BbS.okacop021.info/PoSt/1120_678585.HtM
BbS.okacop022.info/PoSt/1120_058688.HtM
BbS.okacop023.info/PoSt/1120_511012.HtM
BbS.okacop024.info/PoSt/1120_677508.HtM
BbS.okacop025.info/PoSt/1120_261067.HtM
BbS.okacop026.info/PoSt/1120_677892.HtM
BbS.okacop027.info/PoSt/1120_414338.HtM
BbS.okacop028.info/PoSt/1120_519331.HtM
BbS.okacop029.info/PoSt/1120_998147.HtM
BbS.okacop020.info/PoSt/1120_280178.HtM
BbS.okacop021.info/PoSt/1120_585773.HtM
BbS.okacop022.info/PoSt/1120_597540.HtM
BbS.okacop023.info/PoSt/1120_855356.HtM
BbS.okacop024.info/PoSt/1120_260034.HtM
BbS.okacop025.info/PoSt/1120_337229.HtM
BbS.okacop026.info/PoSt/1120_544743.HtM
BbS.okacop027.info/PoSt/1120_069660.HtM
BbS.okacop028.info/PoSt/1120_040660.HtM
BbS.okacop029.info/PoSt/1120_362526.HtM
BbS.okacop020.info/PoSt/1120_342555.HtM
BbS.okacop021.info/PoSt/1120_263648.HtM
BbS.okacop022.info/PoSt/1120_355375.HtM
BbS.okacop023.info/PoSt/1120_636831.HtM
BbS.okacop024.info/PoSt/1120_882384.HtM
BbS.okacop025.info/PoSt/1120_201384.HtM
BbS.okacop026.info/PoSt/1120_937844.HtM
BbS.okacop027.info/PoSt/1120_442145.HtM
BbS.okacop028.info/PoSt/1120_890882.HtM
BbS.okacop029.info/PoSt/1120_139766.HtM