Skip to content

Commit 83cbdd0

Browse files
zhouboyi1998zhouboyi
authored andcommitted
docs(note): 添加题解:69. x 的平方根
1 parent 5249c6e commit 83cbdd0

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<h1 style="text-align: center;"> <span style="color: #00AF9B;">69. x 的平方根</span> </h1>
2+
3+
### 🚀 LeetCode
4+
5+
<base target="_blank">
6+
7+
<span style="color: #00AF9B;">**Easy**</span> [**https://leetcode.cn/problems/sqrtx/**](https://leetcode.cn/problems/sqrtx/)
8+
9+
---
10+
11+
### ❓ Description
12+
13+
<br/>
14+
15+
给你一个非负整数 `x` ,计算并返回 `x`**算术平方根**
16+
17+
由于返回类型是整数,结果只保留 **整数部分** ,小数部分将被 **舍去**
18+
19+
**注意:** 不允许使用任何内置指数函数和算符,例如 `pow(x, 0.5)` 或者 `x ** 0.5`
20+
21+
<br/>
22+
23+
**示例 1:**
24+
25+
```
26+
输入: x = 4
27+
输出: 2
28+
```
29+
30+
**示例 2:**
31+
32+
```
33+
输入: x = 8
34+
输出: 2
35+
解释: 8 的算术平方根是 2.82842..., 由于返回类型是整数, 小数部分将被舍去
36+
```
37+
38+
<br/>
39+
40+
**提示:**
41+
42+
* `0 <= x <= 2^31 - 1`
43+
44+
---
45+
46+
### ❗ Solution
47+
48+
<br/>
49+
50+
#### idea
51+
52+
* 使用 <span style="color: #AF52DE;">**二分法**</span> 来寻找 `x` 的平方根的整数部分
53+
54+
55+
* 因为题目规定参数 `x` 是一个 `int` 类型的非负整数,即 `0 <= x <= 2^31 - 1 = 2147483647`
56+
* 所以 `x` 的平方根的整数部分最大为 `46340`,再大的话,平方后就会超过 `int` 类型的范围
57+
* 使用 **开区间** 定义 **左右边界** `(0, 46340 + 1)`
58+
* 当然,如果 `x` 本身就比 `46340` 小,**左右边界** 可以直接设置为 `(0, x + 1)`
59+
60+
61+
* 通过 **二分法** 不断更新 `left``right` 的值
62+
* 直到 **开区间** 内已经没有值,退出循环
63+
* 此时 `left` 就是 `x` 的平方根的整数部分
64+
65+
<br/>
66+
67+
#### C++
68+
69+
```
70+
class Solution {
71+
public:
72+
int mySqrt(int x) {
73+
int left = 0;
74+
int right = min(x, 46340) + 1;
75+
while (left + 1 < right) {
76+
// 获取 left 和 right 的中值 mid
77+
int mid = (left + right) / 2;
78+
// 计算 mid 的平方, 更新 left 或 right 的值
79+
if (mid * mid <= x) {
80+
left = mid;
81+
} else {
82+
right = mid;
83+
}
84+
}
85+
return left;
86+
}
87+
};
88+
```
89+
90+
<br/>
91+
92+
#### Java
93+
94+
```
95+
class Solution {
96+
public int mySqrt(int x) {
97+
int left = 0;
98+
int right = Math.min(x, 46340) + 1;
99+
while (left + 1 < right) {
100+
// 获取 left 和 right 的中值 mid
101+
int mid = (left + right) / 2;
102+
// 计算 mid 的平方, 更新 left 或 right 的值
103+
if (mid * mid <= x) {
104+
left = mid;
105+
} else {
106+
right = mid;
107+
}
108+
}
109+
return left;
110+
}
111+
}
112+
```

markdown/hello/0000.Hello.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
| <span style="color: #00AF9B;">**Easy**</span> | [**0058.最后一个单词的长度**](../easy/0058.最后一个单词的长度.md) |
3434
| <span style="color: #FFB822;">**Medium**</span> | [**0059.螺旋矩阵II**](../medium/0059.螺旋矩阵II.md) |
3535
| <span style="color: #00AF9B;">**Easy**</span> | [**0066.加一**](../easy/0066.加一.md) |
36+
| <span style="color: #00AF9B;">**Easy**</span> | [**0069.x的平方根**](../easy/0069.x的平方根.md) |
3637
| <span style="color: #00AF9B;">**Easy**</span> | [**0070.爬楼梯**](../easy/0070.爬楼梯.md) |
3738
| <span style="color: #FFB822;">**Medium**</span> | [**0080.删除有序数组中的重复项II**](../medium/0080.删除有序数组中的重复项II.md) |
3839
| <span style="color: #FFB822;">**Medium**</span> | [**0082.删除排序链表中的重复元素II**](../medium/0082.删除排序链表中的重复元素II.md) |

0 commit comments

Comments
 (0)