【递归、二分查找】数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数。

 1 /**
 2  * 数字在排序数组中出现的次数
 3  * 
 4  * 思路:有序数组,使用二分查找,找到第一个和最后一个K出现的位置
 5  * 
 6  * @author Administrator
 7  *
 8  */
 9 public class Solution {
10     public int GetNumberOfK(int[] array, int k) {
11 
12         int count = 0;
13 
14         if (null != array && array.length > 0) {
15 
16             int first = GetFirstK(array, k, 0, array.length - 1);
17             int last = GetLastK(array, k, 0, array.length - 1);
18 
19             if ((first > -1) && (last > -1)) {
20                 count = last - first + 1;
21             }
22         }
23 
24         return count;
25     }
26 
27     /**
28      * 递归求解第一个k出现的位置
29      * 
30      * @param array
31      * @param k
32      * @param start
33      * @param end
34      * @return
35      */
36     public int GetFirstK(int[] array, int k, int start, int end) {
37 
38         if (start > end) {
39             return -1;
40         }
41 
42         int mid = (start + end) / 2;
43         int midData = array[mid];
44 
45         if (midData == k) {
46             if ((mid >= 1 && array[mid - 1] != k) || mid == 0) {
47                 return mid;
48             } else {
49                 end = mid - 1;
50             }
51         } else if (midData > k) {
52             end = mid - 1;
53         } else {
54             start = mid + 1;
55         }
56 
57         return GetFirstK(array, k, start, end);
58     }
59 
60     /**
61      * 递归求解最后一个k出现的位置
62      * 
63      * @param array
64      * @param k
65      * @param start
66      * @param end
67      * @return
68      */
69     public int GetLastK(int[] array, int k, int start, int end) {
70 
71         if (start > end) {
72             return -1;
73         }
74 
75         int mid = (start + end) / 2;
76         int midData = array[mid];
77 
78         if (midData == k) {
79             if ((mid + 1 < array.length && array[mid + 1] != k) || mid == array.length - 1) {
80                 return mid;
81             } else {
82                 start = mid + 1;
83             }
84         } else if (midData > k) {
85             end = mid - 1;
86         } else {
87             start = mid + 1;
88         }
89 
90         return GetLastK(array, k, start, end);
91     }
92 }
原文地址:https://www.cnblogs.com/jiangyi-uestc/p/5846200.html