二分查找高效破解旋转数组

搜索旋转排序数组(LeetCode 33)

给定一个旋转后的有序数组和一个目标值,要求确定目标值是否存在于数组中。旋转排序数组的特点是部分有序,可以通过二分查找的变种高效解决。

核心思路:利用二分查找确定有序部分,判断目标值是否在有序范围内。每次将数组分为两部分,至少有一部分是有序的。通过比较中间元素与左右边界,确定目标值所在的区间。

关键步骤

  • 初始化左右指针 leftright
  • 计算中间位置 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)

在旋转后的有序数组中寻找最小元素。旋转数组的最小值通常位于无序部分的起始点。

核心思路:通过二分查找比较中间元素与右边界元素。若中间元素大于右边界,最小值在右半部分;否则在左半部分。

关键步骤

  • 初始化左右指针 leftright
  • 比较中间元素 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

#牛客AI配图神器#

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务