Heyking

导航

 


### 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 2023-04-09 22:55  CTF小明  阅读(11)  评论(0编辑  收藏  举报