Heyking

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
统计
 


### 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;
}
}
```

>不管生活多么苦难,我们都要坚持下去。因为前方的路还很长,未来的日子更加美好。每一次的挑战都是成长的机会,每一次的努力都会有回报。相信自己,相信未来,让我们一起走向幸福的明天!

posted on   CTF小明  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
 
点击右上角即可分享
微信分享提示