随笔 - 384  文章 - 0  评论 - 0  阅读 - 13万

力扣69(java&python)-x的平方根(简单)

题目:

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

 

示例 1:

输入:x = 4
输出:2
示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
 

提示:

  • 0 <= x <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

【二分查找法】

 取左右指针,left  = 1,right = x,求出中位数mid,判断temp = mid * mid 与 x 的大小关系。如果temp < x,说明mid左边的数的平方都小于x ,即left = mid +1;如果temp > x,说明mid右边的数的平方都大于x ,即left = mid -1;如果temp = x,直接返回mid,循环结束后返回right。

 部分操作解释:

1.long temp = (long)(mid) *(long)(mid);

在二分查找的方法中,只把temp类型设置为long,mid的类型设置为int,为什么通过不了测试?之前想着乘完再转类型,类似这样 long temp = (long)( mid * mid)。这样通过不了测试,因为这样乘其实就是int*int类型,结果还是int类型,然后再强转long,可能在乘的过程中就已经越界了。所以我们需要在乘之前就需要强转。

 2.为什么返回 right?

 循环结束的条件是left > right,即left = right + 1,这时候left的平方已经大于x,故满足条件是就是right。

例如:x = 8,过程如下:

  • left = 1, right = 8, mid = (1 + 8) / 2 = 4, mid *mid = 16 > 8 ==> right = mid - 1 = 3,left = 1;
  • left = 1, right = 3, mid = (1 + 3) / 2 = 2, mid *mid = 4 < 8 ==> left = mid + 1 = 3, right = 3 ;
  • left = 3, right = 3, mid = (3 + 3) / 2 = 3, mid *mid = 9 > 8 ==> right = mid - 1 =2, left = 3;
  • left > right循环结束,应该返回right = 2。

java代码:

复制代码
 1 class Solution {
 2     public int mySqrt(int x) {
 3         if(x == 0 || x == 1){
 4             return x;
 5         }
 6         int left = 1, right = x;
 7         while(left <= right){
 8             int mid = left + (right - left) / 2;
 9             //注意!!
10             long temp = (long)(mid) *(long)(mid);
11             if(temp < x){
12                 left = mid + 1;
13             }else if(temp > x){
14                 right = mid - 1;
15             }else{
16                 return mid;
17             }
18         }
19         return right;
20     }
21 }
复制代码

 python3:

这里稍微改动了一下:

1.while的条件改成了: while(left < right),这样循环结束的条件是:left == right,这样直接返回left或者right就行,不用额外判断。

2.mid = left + (right - left + 1) // 2:

原来是mid = left + (right - left ) // 2,这是向下取整,当只有两个元素的时候,向下取整时mid == left,一旦搜索区间为[mid, right],那么就会一直在[left, right]这个区间搜索,并不会缩小区间,反复下去,就是死循环,因此加1,变成向上取整。

3.left 和 right 的范围:

  • if的条件是 mid的平方小于x,mid有可能就是那个整数以及比它大的数也有可能成为解,答案区间就可能在[mid, right],此时设置left = mid;
  • elif的条件是mid的平方大于x,mid肯定不是解,以及比它大的整数也不会是解,那么区间就是[left, mid - 1],此时设置right = mid - 1;
  • else的条件是mid的平方等于x,那解就是mid,直接返回即可。

python3代码:

复制代码
 1 class Solution:
 2     def mySqrt(self, x: int) -> int:
 3         if x == 0 or x == 1:
 4             return x
 5         left, right = 1, x
 6         while left < right:
 7             # 注意
 8             mid = left + (right - left + 1) // 2
 9             temp = mid * mid
10             # 下一轮搜索区间是[mid, right]
11             if temp < x:
12                 left = mid
13             elif temp > x:
14                 #下一轮搜索区间是[left, mid-1]
15                 right = mid - 1
16             else:
17                 return mid
18         return left
复制代码

2023-04-21:java二刷

复制代码
 1 class Solution {
 2     public int mySqrt(int x) {
 3         if (x == 0 || x == 1) return x;
 4         int left = 1, right = x / 2;
 5         while (left < right){
 6             int mid = left + (right - left + 1) / 2;
 7             long temp = (long)(mid) * (long)(mid);
 8             if (temp <= x){
 9                 //下一步搜索区间为:[mid, right]
10                 left = mid;
11             }else{
12                 right = mid - 1;
13             }
14         }
15         return left;
16     }
17 }
复制代码

 

posted on   我不想一直当菜鸟  阅读(213)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2021-11-13 2.css的导入方式
2021-11-13 18_非单文件组件
< 2025年3月 >
23 24 25 26 27 28 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 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示