题目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)