码迷,mamicode.com
首页 > 编程语言 > 详细

53-1-在排序数组中查找数字

时间:2019-09-10 21:00:51      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:turn   两种   def   fir   first   二次   复杂   div   二分法   

题目:数字在排序数组中出现的次数。输入为一个排序数组和一个数字。

def get_first_num(nums,k,start,end):
    if start>end:
        return -1
    mid = (end+start)//2
    if nums[mid]==k:
        if mid==0 or (mid>0 and nums[mid-1]!=k):
            return mid
        else:
            end = mid-1
    elif nums[mid]>k:
        end = mid-1
    else:
        start = mid+1

    return get_first_num(nums,k,start,end)

def get_end_num(nums,k,start,end):
    if start>end:
        return -1
    mid = (end + start) // 2
    if nums[mid]==k:
        if mid==len(nums)-1 or (mid<len(nums)-1 and nums[mid+1]!=k):
            return mid
        else:
            start = mid
    elif nums[mid]>k:
        end = mid-1
    else:
        start = mid+1
    return get_end_num(nums,k,start,end)

def get_num_k(nums,k):
    start = get_first_num(nums,k,0,len(nums)-1)
    end = get_end_num(nums,k,0,len(nums)-1)
    print(start,end)
    return end-start+1

  注:一般解决方式为利用字典统计各个数字出现的次数或者用二分法查找到其中一个目标数字,然后前后再前后查找。这两种方式的时间复杂度都为O(n)。

O(lgn)的方法为使用两次二分查找,第一次查找目标数字第一次出现的位置,第二次查找其最后一次出现的位置,最后两者相减即为目标数的个数。

53-1-在排序数组中查找数字

标签:turn   两种   def   fir   first   二次   复杂   div   二分法   

原文地址:https://www.cnblogs.com/kingshine007/p/11502743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!