Skip to content

Commit f5ad47b

Browse files
committed
auto commit
1 parent e9d511e commit f5ad47b

File tree

2 files changed

+84
-10
lines changed

2 files changed

+84
-10
lines changed

docs/notes/53. 数字在排序数组中出现的次数.md

+42-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# 53. 数字在排序数组中出现的次数
22

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)
46

57
## 题目描述
68

@@ -15,13 +17,30 @@ Output:
1517

1618
## 解题思路
1719

20+
只要能找出给定的数字 k 在有序数组第一个位置和最后一个位置,就能知道该数字出现的次数。
21+
22+
先考虑如何实现寻找数字在有序数组的第一个位置。正常的二分查找如下,在查找到给定元素 k 之后,立即返回当前索引下标。
23+
1824
```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;
2338
}
39+
```
2440

41+
但是在查找第一个位置时,找到元素之后应该继续往前找。也就是当 nums[m]>=k 时,在左区间继续查找,左区间应该包含 m 位置。
42+
43+
```java
2544
private int binarySearch(int[] nums, int K) {
2645
int l = 0, h = nums.length;
2746
while (l < h) {
@@ -35,6 +54,24 @@ private int binarySearch(int[] nums, int K) {
3554
}
3655
```
3756

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+
3875

3976

4077

notes/53. 数字在排序数组中出现的次数.md

+42-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# 53. 数字在排序数组中出现的次数
22

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)
46

57
## 题目描述
68

@@ -15,13 +17,30 @@ Output:
1517

1618
## 解题思路
1719

20+
只要能找出给定的数字 k 在有序数组第一个位置和最后一个位置,就能知道该数字出现的次数。
21+
22+
先考虑如何实现寻找数字在有序数组的第一个位置。正常的二分查找如下,在查找到给定元素 k 之后,立即返回当前索引下标。
23+
1824
```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;
2338
}
39+
```
2440

41+
但是在查找第一个位置时,找到元素之后应该继续往前找。也就是当 nums[m]>=k 时,在左区间继续查找,左区间应该包含 m 位置。
42+
43+
```java
2544
private int binarySearch(int[] nums, int K) {
2645
int l = 0, h = nums.length;
2746
while (l < h) {
@@ -35,6 +54,24 @@ private int binarySearch(int[] nums, int K) {
3554
}
3655
```
3756

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+
3875

3976

4077

0 commit comments

Comments
 (0)