• LeetCode#34 Search for a Range


    Problem Definition:

    Given a sorted array of integers, find the starting and ending position of a given target value.

    Your algorithm's runtime complexity must be in the order of O(log n).

    If the target is not found in the array, return [-1, -1].

    For example,
    Given [5, 7, 7, 8, 8, 10] and target value 8,
    return [3, 4].

    Solution:

    有序数组,二分查找。这里要查找的是一个范围,[start-->end]。

    当进行二分查找时,会找到很多个[start-->end],应该合并为一个大的范围。即要找到最大的end和最小的start。

     1     # @param {integer[]} nums
     2     # @param {integer} target
     3     # @return {integer[]}
     4     def searchRange(self, nums, target):
     5         rg=[2147483647, -1]
     6         self.recur(nums, target, 0, len(nums)-1, rg)
     7         if rg[0]==2147483647:
     8             rg[0]=-1
     9         return rg
    10         
    11     def recur(self, nums, target,start, end, rg):
    12         if nums[start]>target or nums[end]<target:
    13             return
    14         if start==end: #only one element
    15             if nums[start]==target:
    16                 rg[0]=min(rg[0], start)
    17                 rg[1]=max(rg[1], end)
    18         else:
    19             mid=(start+end)/2
    20             if nums[mid]>target:
    21                 self.recur(nums, target, start, mid, rg)
    22             elif nums[mid]<target:
    23                 self.recur(nums, target, mid+1, end, rg)
    24             else:
    25                 self.recur(nums, target, start, mid, rg)
    26                 self.recur(nums, target, mid+1, end, rg)

    解释:

    1)用一个二元的数组rg来存放起止点的下标。

    2)如果一个子数组,它起始的元素就已经比目标target要大,或者它的终止位置比target要小,就直接退出当前的查找了。

    3)如果数组中间位置刚好等于target,则应该往左右两部分分别继续去查找。

  • 相关阅读:
    今日总结
    今日总结
    今日总结
    本周总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    vue3函数setUp和reactive函数详细讲解
  • 原文地址:https://www.cnblogs.com/acetseng/p/4702227.html
Copyright © 2020-2023  润新知