题目描述
统计一个数字在排序数组中出现的次数。
思路:
采用二分查找,因为数组是排序的,所以找到第一次出现的地方,和最后一次出现的地方,相减加1即为出现次数
注意的点:
1.变量的边界值,mid+1,mid-1是否越界
2,左边没找到,右边没找到,如果都返回0,就和左边找到的索引是0,右边找到的索引也是0,就很难区分是哪种情况,所以,没找到返回-1,找到返回索引。
3.递归调用的地方注意写return
4,注意判断,要start<=end
1 # -*- coding:utf-8 -*-
2 class Solution:
3 def GetNumberOfK(self, data, k):
4 # write code here
5 # 采用折半查找思路
6 if len(data) == 0:
7 return 0
8 # if k not in data:
9 # return 0
10 left = self.findHalf1(data, 0, len(data) - 1, k)
11 right = self.findHalf2(data, 0, len(data) - 1, k)
12 if left==-1 and right==-1:
13 return 0
14 return right - left + 1
15
16 def findHalf1(self, data, start, end, k):
17 if start>end:
18 return -1
19 mid = (start + end) >> 1
20 if data[mid] > k: # 中间的值比k大
21 if mid == 0:
22 return -1
23 end = mid-1
24
25 if data[mid] < k:
26 if mid == len(data)-1:
27 return -1
28 start = mid + 1
29 if data[mid] == k:
30 if mid ==0 or data[mid - 1] != k:
31 return mid
32 else:
33 end = mid - 1
34
35 return self.findHalf1(data, start, end, k)
36
37 def findHalf2(self, data, start, end, k):
38 if start > end:
39 return -1
40 mid = (start + end) >> 1
41 if data[mid] > k: # 中间的值比k大
42 if mid == 0:
43 return -1
44 end = mid - 1
45 if data[mid] < k:
46 if mid == len(data)-1:
47 return -1
48 start = mid + 1
49 if data[mid] == k:
50 if mid+1 == len(data) or data[mid + 1] != k :
51 return mid
52 else:
53 start = mid + 1
54 return self.findHalf2(data, start, end, k)