题目描述
统计一个数字在排序数组中出现的次数。
思路:二分法查找第一个出现的位置,和最后一次出现的位置。
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
number = 0
if data:
length = len(data)
first = self.GetFirstK(data, k, 0, length-1)
last = self.GetLastK(data, k, 0, length-1)
if first>-1 and last>-1:
number = last-first+1
return number
def GetFirstK(self, data, k, start, end):
if start>end:
return -1
middle = (start+end)//2
if data[middle]==k:
if (middle>0 and data[middle-1]!=k) or middle==0:
return middle
else:
end = middle-1
elif data[middle]>k:
end = middle-1
else:
start = middle+1
return self.GetFirstK(data, k, start, end)
def GetLastK(self, data, k, start, end):
if start>end:
return -1
middle = (start+end)//2
if data[middle]==k:
if (middle< len(data)-1 and data[middle+1]!=k) or middle==len(data)-1:
return middle
else:
start = middle+1
elif data[middle]<k:
start = middle+1
else:
end = middle-1
return self.GetLastK(data, k, start, end)
题目描述:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
思路:
这个数组就是排序数组中第一个值与下标不相等的元素。用二分法查找。如果中间元素的值和下标相等,下一轮只需要查找右半边。如果中间元素和下标不相等,并且它前面一个元素和下标相等,则这个中间元素的数字正好是第一个值和下标不想等的元素,它的下标就是数组中不存在的数字。如果中间元素的值和下标不相等,且前一个元素和下标也不相等,下一轮就查找左半边。
# -*- coding:utf-8 -*-
class Solution:
def GetMissingNumber(self, numbers):
if not numbers:
return -1
left = 0
right = len(numbers)-1
while left<=right:
middle = (right+left)//2
if numbers[middle]!=middle:
if middle==0 or numbers[middle-1]==middle-1:
return middle
right = middle-1
else:
left = middle+1
if left==len(numbers):
return left
return -1