### x 的平方根
力扣链接:[x 的平方根 ](https://leetcode.cn/problems/sqrtx/)
#### 题目
> 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
>
> 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
>
> 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
> 示例 1:
>
> 输入:x = 4
>
> 输出:2
>
>
>
> 示例 2:
>
> 输入:x = 8
>
> 输出:2
>
> 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
> 提示:
>
> 0 <= x <= 231 - 1
#### 分析
>从题目的要求和示例我们可以看出,这其实是一个查找非负整数的问题,并且这个整数是有范围的。
>
>如果这个整数的平方**等于**输入整数,那么这个整数就是结果。
>
>如果这个整数的平方**大于**输入整数,那么这个整数肯定不是结果。
>
>如果这个整数的平方**小于**输入整数,那么这个整数**可能**是结果。
>
>因此我们可以使用「二分查找」来查找这个整数,不断缩小范围去找
>
>猜的数平方以后大了就往小了猜;
>
>猜的数平方以后恰恰好等于输入的数就找到了;
>
>猜的数平方以后小了,可能猜的数就是,也可能不是。
```java
public class Solution {
public int mySqrt(int x) {
// 特殊值判断
if (x <= 1) {
return x;
}
int left = 1;
int right = x / 2;
// 在区间 [left..right] 查找目标元素
while (left < right) {
int mid = left + (right - left + 1) / 2;
// 注意:这里为了避免乘法溢出,改用除法
if (mid > x / mid) {
// 下一轮搜索区间是 [left..mid - 1]
right = mid - 1;
} else {
// 下一轮搜索区间是 [mid..right]
left = mid;
}
}
return left;
}
}
class Solution {
public int mySqrt(int x) {
int left = 0;
int right = x;
int ans = -1;
while(left <= right){
int mid = (left + right) /2 ;
if((long)mid*mid > x){
right = mid - 1;
}else if (mid * mid <= x) {
// ans = mid;
left = mid + 1;
}
}
return ans;
}
}
```
>不管生活多么苦难,我们都要坚持下去。因为前方的路还很长,未来的日子更加美好。每一次的挑战都是成长的机会,每一次的努力都会有回报。相信自己,相信未来,让我们一起走向幸福的明天!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)