Skip to content

Commit dfbc8a1

Browse files
zhouboyi1998zhouboyi
authored andcommitted
docs(note): 添加题解:374. 猜数字大小
1 parent 83cbdd0 commit dfbc8a1

File tree

2 files changed

+151
-0
lines changed

2 files changed

+151
-0
lines changed
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
<h1 style="text-align: center;"> <span style="color: #00AF9B;">374. 猜数字大小</span> </h1>
2+
3+
### 🚀 LeetCode
4+
5+
<base target="_blank">
6+
7+
<span style="color: #00AF9B;">**Easy**</span> [**https://leetcode.cn/problems/guess-number-higher-or-lower/**](https://leetcode.cn/problems/guess-number-higher-or-lower/)
8+
9+
---
10+
11+
### ❓ Description
12+
13+
<br/>
14+
15+
我们正在玩猜数字游戏。猜数字游戏的规则如下:
16+
17+
我会从 `1``n` 随机选择一个数字。请你猜选出的是哪个数字。
18+
19+
如果你猜错了,我会告诉你,我选出的数字比你猜测的数字大了还是小了。
20+
21+
你可以通过调用一个预先定义好的接口 `int guess(int num)` 来获取猜测结果,
22+
23+
返回值一共有三种可能的情况:
24+
25+
* `-1`:你猜的数字比我选出的数字大(即 `num > pick`)。
26+
* `1`:你猜的数字比我选出的数字小(即 `num < pick`)。
27+
* `0`:你猜的数字与我选出的数字相等(即 `num == pick`)。
28+
29+
返回我选出的数字。
30+
31+
<br/>
32+
33+
**示例 1:**
34+
35+
```
36+
输入: n = 10, pick = 6
37+
输出: 6
38+
```
39+
40+
**示例 2:**
41+
42+
```
43+
输入: n = 1, pick = 1
44+
输出: 1
45+
```
46+
47+
**示例 3:**
48+
49+
```
50+
输入: n = 2, pick = 1
51+
输出: 1
52+
```
53+
54+
<br/>
55+
56+
**提示:**
57+
58+
* `1 <= n <= 2^31 - 1`
59+
* `1 <= pick <= n`
60+
61+
---
62+
63+
### ❗ Solution
64+
65+
<br/>
66+
67+
#### idea
68+
69+
* 使用 <span style="color: #AF52DE;">**二分法**</span> 寻找 `pick` 的值
70+
71+
72+
* 使用 **闭区间** 定义 **左右边界** `[1, n]`
73+
74+
75+
* 通过 **二分法** 选择当前猜测的数字 `mid`
76+
* 通过 `guess()` 方法判断当前猜测的数字与 `pick` 的大小关系
77+
* 如果 `pick` <= `mid`,说明 `pick``[left, mid]` 之间
78+
* 如果 `pick` > `mid`,说明 `pick``[mid + 1, right]` 之间
79+
* 直到 **闭区间****左边界** `left`**右边界** `right` 相等,退出循环
80+
* 此时 `left` 就是答案 `pick` 的值
81+
82+
<br/>
83+
84+
#### C++
85+
86+
```
87+
/**
88+
* Forward declaration of guess API.
89+
* @param num your guess
90+
* @return -1 if num is higher than the picked number
91+
* 1 if num is lower than the picked number
92+
* otherwise return 0
93+
* int guess(int num);
94+
*/
95+
96+
class Solution {
97+
public:
98+
int guessNumber(int n) {
99+
int left = 1;
100+
int right = n;
101+
while (left < right) {
102+
// 因为 n 的值可能是 int 类型的最大值 2^31 - 1
103+
// 此时 left + right 会溢出
104+
// 所以计算中值 mid 时不能用最简单的 (left + right) / 2
105+
int mid = left + (right - left) / 2;
106+
if (guess(mid) <= 0) {
107+
right = mid;
108+
} else {
109+
left = mid + 1;
110+
}
111+
}
112+
return left;
113+
}
114+
};
115+
```
116+
117+
<br/>
118+
119+
#### Java
120+
121+
```
122+
/**
123+
* Forward declaration of guess API.
124+
*
125+
* @param num your guess
126+
* @return -1 if num is higher than the picked number
127+
* 1 if num is lower than the picked number
128+
* otherwise return 0
129+
* int guess(int num);
130+
*/
131+
132+
public class Solution extends GuessGame {
133+
public int guessNumber(int n) {
134+
int left = 1;
135+
int right = n;
136+
while (left < right) {
137+
// 因为 n 的值可能是 int 类型的最大值 2^31 - 1
138+
// 此时 left + right 会溢出
139+
// 所以计算中值 mid 时不能用最简单的 (left + right) / 2
140+
int mid = left + (right - left) / 2;
141+
if (guess(mid) <= 0) {
142+
right = mid;
143+
} else {
144+
left = mid + 1;
145+
}
146+
}
147+
return left;
148+
}
149+
}
150+
```

markdown/hello/0000.Hello.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
| <span style="color: #00AF9B;">**Easy**</span> | [**0258.各位相加**](../easy/0258.各位相加.md) |
7373
| <span style="color: #FFB822;">**Medium**</span> | [**0289.生命游戏**](../medium/0289.生命游戏.md) |
7474
| <span style="color: #00AF9B;">**Easy**</span> | [**0292.Nim游戏**](../easy/0292.Nim游戏.md) |
75+
| <span style="color: #00AF9B;">**Easy**</span> | [**0374.猜数字大小**](../easy/0374.猜数字大小.md) |
7576
| <span style="color: #FFB822;">**Medium**</span> | [**0397.整数替换**](../medium/0397.整数替换.md) |
7677
| <span style="color: #FFB822;">**Medium**</span> | [**0413.等差数列划分**](../medium/0413.等差数列划分.md) |
7778
| <span style="color: #FF2D55;">**Hard**</span> | [**0446.等差数列划分II-子序列**](../hard/0446.等差数列划分II-子序列.md) |

0 commit comments

Comments
 (0)