力扣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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2021-11-13 2.css的导入方式
2021-11-13 18_非单文件组件