高编课后作业------第八周-LeetCode-34.搜索范围

题面如下:


之前一直不是很清楚二分法,只会写模板,直到上个学期看了数据结构那本教材才弄清楚,书写的是真的好。这题就是用这个的,用不同写法的二分找出不同位置的数(如果有多个target在nums中)。

注意找下限和上限时写法上的细微差别,思路就是找下限时在r左边的都是 小于等于 target的,因此如果碰到多个target,r也会不断地缩小。找上限思路类似,不过要注意由于判停条件依旧为l<r,因此mid=(l+r+1)/2,至于原因的话考虑只有两个数的情况就可以了。

另外python除法自动以浮点数存储所以要用int()。

class Solution:
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        n = len(nums)
        if n==0:
            return [-1,-1]
        l = 0
        r = n-1
        while(l<r):
            mid = int((l+r+1)/2)
            if(nums[mid]<=target):
                l = mid
            else:
                r = mid-1
        if nums[l]==target:
            up = l
        else:
            up = -1
        
        l = 0 
        r = n-1
        while(l<r):
            mid = int((l+r)/2)
            if(nums[mid]<target):
                l = mid + 1
            else:
                r = mid
        if nums[r] == target:
            down = r
        else:
            down = -1
        return [down,up]

猜你喜欢

转载自blog.csdn.net/syyjiang/article/details/80137366