剑指offer53:在排序数组中查找数字

题目1:数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数

 

# #方法1:count
# def GetNumberOfK(data,k):
#     if not data or len(data)==0:
#         return 0
#     return data.count(k)
# data=[1,2,3,3,3,3,4,5]
# GetNumberOfK(data,3)
#方法2:暴力法 O(n)时间,O(n) 空间
def GetNumberOfK(data,k):
    if not data or len(data)==0:
        return 0
    num=0
    for i in data:
        if i==k:
            num+=1
    return num 
data=[1,2,3,3,3,3,4,5]
GetNumberOfK(data,3)

#方法3:二分查找 O(log(n))
#主要是通过二分查找 找到第一个k和最后一个k,最后下标相减加1就是次数
def GetNumberOfK(data,k):
    if not data or len(data)==0:
        return -1
    left =0 
    right=len(data)-1
    leftk=GetFirstK(data,k,left,right)
    rightk=GetLastK(data,k,left,right)
    return rightk-leftk+1
    
    
def GetFirstK(data,k,left,right):
    if left>right:
        return -1
    if not data or len(data)==0:
        return -1
    while left<=right:
        mid=(left+right)//2
        if data[mid]==k:
            if (mid>0 and data[mid-1]!=k) or mid==0:
                return mid
            else:
                right =mid-1
        elif data[mid]>k:
            right=mid-1
        else:
            left=mid+1
    return left    
    
def GetLastK(data,k,left,right):
    if left>right:
        return -1
    if not data or len(data)==0:
        return -1
    while left<=right:
        mid=(left+right)//2
        if data[mid]==k:
            if (data[mid+1]!=k and mid<len(data)-1) or mid==len(data)-1:
                return mid
            else:
                left=mid+1
                
        elif data[mid]<k:
            left=mid+1
        else:
            right=mid-1
    return right
    
data=[1,2,3,3,3,3,4,5]
GetNumberOfK(data,3)

 

# 题目2:0~n-1中缺失的数字
# def getMissingNumber(numbers):
    #方法1:求出0~n-1所有数字之和s1,求出数组所有数字之和s2,s1-s2
#     n=len(numbers)
#     s1=(n+1)*n/2
#     s2=0
#     for i in range(n):
#         s2+=numbers[i]
#     return s1-s2
    #方法2:二分查找
    #如果不在数组中的那个数字记为m,那么所有比m小的数字的下标都与他们的值相同,m+1处在下标m的位置,m+2处在下标为m+1的位置,
    #那么这题就转换成在排序数组中找出第一个值和下标不相等的元素
    #1如果中间元素的值和下标相等,那么下一轮查找只需要查找右半边,2如果中间元素的值和下标不相等,并且它前面一个元素和他的下标相等,
    #那么这个中间元素就是要找的m,3,如果中间元素的值和下标不相等,并且它前面一个元素和他的下标不相等,那么下一轮查找只需要查找左半边
#     if not numbers or len(numbers)<=0:
#         return -1

def getMissingNumber(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    start, end = 0, len(nums) - 1
    while(start <= end):
#         mid = int((start + end)/2)
        mid =start+(end-start)//2
        if mid != nums[mid]:
            if mid == 0 or nums[mid - 1]== mid - 1 :
                return mid
            else:
                end = mid - 1
        else:
            start = mid + 1
    if start == len(nums):
        return start        
num=[1,2,3,4]
getMissingNumber(num)
        
题目3:数组中数值和下标相等的元素    

 

def getNumberSameAsIndex(numbers):
    #方法1 暴力法O(n)
#     for i in range(len(numbers)):
#         if not numbers or len(numbers)<=0:
#             return -1
#         if i ==numbers[i]:
#             return numbers[i]
#     return -1
    #方法2:二分查找
    #假设数字的值为m,如果m>下标i,那么它右边的值都会值大于下标,那么需要从左边的数字中查找
    #反之如果m<下标i,那么它左边边的值都会值小于下标,那么需要从右边的数字中查找
    if not numbers or len(numbers)<=0:
        return -1
    n=len(numbers)
    left=0
    right=n-1
    while left<=right:
        mid=left+(right-left)//2
        if numbers[mid]==mid:
            return numbers[mid]
        elif numbers[mid]>mid:
            right=mid-1
        else:
            left=mid+1
    return -1
    
    
num=[-3,-1,1,3,5]
getNumberSameAsIndex(num)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值