1
1
# 53. 数字在排序数组中出现的次数
2
2
3
- [ NowCoder] ( https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&tqId=11190&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github )
3
+ ## 题目链接
4
+
5
+ [ 牛客网] ( https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&tqId=11190&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github )
4
6
5
7
## 题目描述
6
8
@@ -15,13 +17,30 @@ Output:
15
17
16
18
## 解题思路
17
19
20
+ 只要能找出给定的数字 k 在有序数组第一个位置和最后一个位置,就能知道该数字出现的次数。
21
+
22
+ 先考虑如何实现寻找数字在有序数组的第一个位置。正常的二分查找如下,在查找到给定元素 k 之后,立即返回当前索引下标。
23
+
18
24
``` java
19
- public int GetNumberOfK(int [] nums, int K ) {
20
- int first = binarySearch(nums, K );
21
- int last = binarySearch(nums, K + 1 );
22
- return (first == nums. length || nums[first] != K ) ? 0 : last - first;
25
+ public int binarySearch(int [] nums, int K ) {
26
+ int l = 0 , h = nums. length - 1 ;
27
+ while (l <= h) {
28
+ int m = l + (h - l) / 2 ;
29
+ if (nums[m] == K ) {
30
+ return m;
31
+ } else if (nums[m] > K ) {
32
+ h = m - 1 ;
33
+ } else {
34
+ l = m + 1 ;
35
+ }
36
+ }
37
+ return - 1 ;
23
38
}
39
+ ```
24
40
41
+ 但是在查找第一个位置时,找到元素之后应该继续往前找。也就是当 nums[ m] >=k 时,在左区间继续查找,左区间应该包含 m 位置。
42
+
43
+ ``` java
25
44
private int binarySearch(int [] nums, int K ) {
26
45
int l = 0 , h = nums. length;
27
46
while (l < h) {
@@ -35,6 +54,24 @@ private int binarySearch(int[] nums, int K) {
35
54
}
36
55
```
37
56
57
+ 查找最后一个位置可以转换成寻找 k+1 的第一个位置,并再往前移动一个位置。
58
+
59
+ ``` java
60
+ public int GetNumberOfK(int [] nums, int K ) {
61
+ int first = binarySearch(nums, K );
62
+ int last = binarySearch(nums, K + 1 );
63
+ return (first == nums. length || nums[first] != K ) ? 0 : last - first;
64
+ }
65
+ ```
66
+
67
+ 需要注意以上实现的查找第一个位置的 binarySearch 方法,h 的初始值为 nums.length,而不是 nums.length - 1。先看以下示例:
68
+
69
+ ```
70
+ nums = [2,2], k = 2
71
+ ```
72
+
73
+ 如果 h 的取值为 nums.length - 1,那么在查找最后一个位置时,binarySearch(nums, k + 1) - 1 = 1 - 1 = 0。这是因为 binarySearch 只会返回 [ 0, nums.length - 1] 范围的值,对于 binarySearch([ 2,2] , 3) ,我们希望返回 3 插入 nums 中的位置,也就是数组最后一个位置再往后一个位置,即 nums.length。所以我们需要将 h 取值为 nums.length,从而使得 binarySearch 返回的区间更大,能够覆盖 k 大于 nums 最后一个元素的情况。
74
+
38
75
39
76
40
77
0 commit comments