Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 06c488e

Browse files
committed
chore: 新增面试题53
1 parent e73480e commit 06c488e

File tree

2 files changed

+153
-0
lines changed

2 files changed

+153
-0
lines changed
8.78 MB
Binary file not shown.
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
# 面试题53 - I. 在排序数组中查找数字 I
2+
3+
> 本文首发于公众号「图解面试算法」,是 [图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>) 系列文章之一。
4+
>
5+
> 同步博客:https://www.algomooc.com
6+
7+
题目来源于 LeetCode 上 面试题53 - I. 在排序数组中查找数字 I. 是算法入门的一道题。
8+
9+
## 题目
10+
11+
统计一个数字在排序数组中出现的次数。
12+
13+
14+
示例 1:
15+
16+
```
17+
输入: nums = [5,7,7,8,8,10], target = 8
18+
输出: 2
19+
```
20+
21+
示例 2:
22+
23+
24+
```
25+
输入: nums = [5,7,7,8,8,10], target = 6
26+
输出: 0
27+
```
28+
29+
30+
限制:
31+
32+
```
33+
0 <= 数组长度 <= 50000
34+
```
35+
36+
37+
## 思路解析
38+
39+
### 暴力循环法
40+
41+
题目看上去是很简单,就是找到一个目标数字在数组中出现的次数,不管数组是有序还是无序的,我们都可以用的一种方法就是暴力循环法
42+
43+
#### 思路
44+
45+
定义一个count来记录目标值出现的次数,初始值为0,然后遍历这个数组,然后如果当前值和目标值target一致,那么count就加一,最后return count。这种解法的时间复杂度是O(N)
46+
47+
#### 代码实现
48+
49+
50+
```javaScript
51+
/**
52+
* @param {number[]} nums
53+
* @param {number} target
54+
* @return {number}
55+
*/
56+
var search = function(nums, target) {
57+
let count = 0;
58+
for(let i of nums) {
59+
if (i === target) {
60+
count++
61+
}
62+
}
63+
return count
64+
};
65+
```
66+
67+
### 改良的暴力循环
68+
69+
#### 思路
70+
71+
因为数组已排序了,所以我们其实可以不用遍历全部,用双指针分别从头部和尾部开始同时遍历,然后找到目标值的左右边界的位置,然后通过计算得到count。其实就是比全部遍历少了目标值出现的次数,它的算法复杂度还是O(n)
72+
73+
count = 右边界的index - 左边界的index + 1
74+
75+
#### 代码实现
76+
77+
78+
```javaScript
79+
/**
80+
* @param {number[]} nums
81+
* @param {number} target
82+
* @return {number}
83+
*/
84+
var search = function(nums, target) {
85+
let [left, right] = [0, nums.length - 1]
86+
while(left <= right && (nums[left] !== target || nums[right] !== target)) {
87+
if (left === right && nums[left] !== target) {
88+
return 0;
89+
}else if (nums[left] !== target) {
90+
left++;
91+
}else if (nums[right] !== target){
92+
right--;
93+
}
94+
}
95+
return right - left + 1;
96+
};
97+
```
98+
99+
### 二分法
100+
101+
#### 思路
102+
103+
除了遍历,我们在排序数组中查找值还可以用的一种方法是二分法,思路还是和改良的暴力循环法一样,先找到左右边界,然后做计算。时间复杂度为O(logn)
104+
105+
#### 代码实现
106+
107+
```javaScript
108+
/**
109+
* @param {number[]} nums
110+
* @param {number} target
111+
* @return {number}
112+
*/
113+
var search = function(nums, target) {
114+
let start = 0;
115+
let mid = 0;
116+
let end = nums.length - 1;
117+
let left = 0;
118+
let right = 0;
119+
// 查找右边界
120+
while(start <= end) {
121+
mid = Math.ceil((start + end) / 2)
122+
if (nums[mid] <= target) {
123+
start = mid + 1
124+
} else {
125+
end = mid -1
126+
}
127+
}
128+
right = start - 1; // 右边界
129+
// 查找左边界
130+
start = 0;
131+
mid = 0;
132+
end = nums.length - 1;
133+
while(start <= end) {
134+
mid = Math.ceil((start + end) / 2)
135+
if (nums[mid] < target) {
136+
start = mid + 1
137+
} else {
138+
end = mid -1
139+
}
140+
}
141+
left = end + 1
142+
return right - left + 1
143+
};
144+
```
145+
146+
## 动画理解
147+
148+
149+
<video id="video" controls="" preload="none" >
150+
<source id="mp4" src="../animation/Interview Question 53 - I. Find number in sort arrayI.mp4" type="video/mp4">
151+
</video>
152+
153+
![](../../Pictures/qrcode.jpg)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /