Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
CS-Notes
提交
f5ad47b4
C
CS-Notes
项目概览
wushizhenking
/
CS-Notes
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
CS-Notes
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f5ad47b4
编写于
11月 05, 2020
作者:
C
CyC2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
auto commit
上级
e9d511e0
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
84 addition
and
10 deletion
+84
-10
docs/notes/53. 数字在排序数组中出现的次数.md
docs/notes/53. 数字在排序数组中出现的次数.md
+42
-5
notes/53. 数字在排序数组中出现的次数.md
notes/53. 数字在排序数组中出现的次数.md
+42
-5
未找到文件。
docs/notes/53. 数字在排序数组中出现的次数.md
浏览文件 @
f5ad47b4
# 53. 数字在排序数组中出现的次数
[
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
)
## 题目链接
[
牛客网
](
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
)
## 题目描述
...
...
@@ -15,13 +17,30 @@ Output:
## 解题思路
只要能找出给定的数字 k 在有序数组第一个位置和最后一个位置,就能知道该数字出现的次数。
先考虑如何实现寻找数字在有序数组的第一个位置。正常的二分查找如下,在查找到给定元素 k 之后,立即返回当前索引下标。
```
java
public
int
GetNumberOfK
(
int
[]
nums
,
int
K
)
{
int
first
=
binarySearch
(
nums
,
K
);
int
last
=
binarySearch
(
nums
,
K
+
1
);
return
(
first
==
nums
.
length
||
nums
[
first
]
!=
K
)
?
0
:
last
-
first
;
public
int
binarySearch
(
int
[]
nums
,
int
K
)
{
int
l
=
0
,
h
=
nums
.
length
-
1
;
while
(
l
<=
h
)
{
int
m
=
l
+
(
h
-
l
)
/
2
;
if
(
nums
[
m
]
==
K
)
{
return
m
;
}
else
if
(
nums
[
m
]
>
K
)
{
h
=
m
-
1
;
}
else
{
l
=
m
+
1
;
}
}
return
-
1
;
}
```
但是在查找第一个位置时,找到元素之后应该继续往前找。也就是当 nums[m]>=k 时,在左区间继续查找,左区间应该包含 m 位置。
```
java
private
int
binarySearch
(
int
[]
nums
,
int
K
)
{
int
l
=
0
,
h
=
nums
.
length
;
while
(
l
<
h
)
{
...
...
@@ -35,6 +54,24 @@ private int binarySearch(int[] nums, int K) {
}
```
查找最后一个位置可以转换成寻找 k+1 的第一个位置,并再往前移动一个位置。
```
java
public
int
GetNumberOfK
(
int
[]
nums
,
int
K
)
{
int
first
=
binarySearch
(
nums
,
K
);
int
last
=
binarySearch
(
nums
,
K
+
1
);
return
(
first
==
nums
.
length
||
nums
[
first
]
!=
K
)
?
0
:
last
-
first
;
}
```
需要注意以上实现的查找第一个位置的 binarySearch 方法,h 的初始值为 nums.length,而不是 nums.length - 1。先看以下示例:
```
nums = [2,2], k = 2
```
如果 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 最后一个元素的情况。
...
...
notes/53. 数字在排序数组中出现的次数.md
浏览文件 @
f5ad47b4
# 53. 数字在排序数组中出现的次数
[
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
)
## 题目链接
[
牛客网
](
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
)
## 题目描述
...
...
@@ -15,13 +17,30 @@ Output:
## 解题思路
只要能找出给定的数字 k 在有序数组第一个位置和最后一个位置,就能知道该数字出现的次数。
先考虑如何实现寻找数字在有序数组的第一个位置。正常的二分查找如下,在查找到给定元素 k 之后,立即返回当前索引下标。
```
java
public
int
GetNumberOfK
(
int
[]
nums
,
int
K
)
{
int
first
=
binarySearch
(
nums
,
K
);
int
last
=
binarySearch
(
nums
,
K
+
1
);
return
(
first
==
nums
.
length
||
nums
[
first
]
!=
K
)
?
0
:
last
-
first
;
public
int
binarySearch
(
int
[]
nums
,
int
K
)
{
int
l
=
0
,
h
=
nums
.
length
-
1
;
while
(
l
<=
h
)
{
int
m
=
l
+
(
h
-
l
)
/
2
;
if
(
nums
[
m
]
==
K
)
{
return
m
;
}
else
if
(
nums
[
m
]
>
K
)
{
h
=
m
-
1
;
}
else
{
l
=
m
+
1
;
}
}
return
-
1
;
}
```
但是在查找第一个位置时,找到元素之后应该继续往前找。也就是当 nums[m]>=k 时,在左区间继续查找,左区间应该包含 m 位置。
```
java
private
int
binarySearch
(
int
[]
nums
,
int
K
)
{
int
l
=
0
,
h
=
nums
.
length
;
while
(
l
<
h
)
{
...
...
@@ -35,6 +54,24 @@ private int binarySearch(int[] nums, int K) {
}
```
查找最后一个位置可以转换成寻找 k+1 的第一个位置,并再往前移动一个位置。
```
java
public
int
GetNumberOfK
(
int
[]
nums
,
int
K
)
{
int
first
=
binarySearch
(
nums
,
K
);
int
last
=
binarySearch
(
nums
,
K
+
1
);
return
(
first
==
nums
.
length
||
nums
[
first
]
!=
K
)
?
0
:
last
-
first
;
}
```
需要注意以上实现的查找第一个位置的 binarySearch 方法,h 的初始值为 nums.length,而不是 nums.length - 1。先看以下示例:
```
nums = [2,2], k = 2
```
如果 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 最后一个元素的情况。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录