数字在排序数组中出现的次数

题目描述

统计一个数字在排序数组中出现的次数。
思路:
采用二分查找,因为数组是排序的,所以找到第一次出现的地方,和最后一次出现的地方,相减加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)
原文地址:https://www.cnblogs.com/shuangcao/p/12786837.html