题目:

给你一个非负整数 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 }

力扣69(java&python)-x的平方根(简单)的更多相关文章

  1. 力扣561. 数组拆分 I-C语言实现-简单题

    题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...

  2. 力扣566. 重塑矩阵-C语言实现-简单题

    题目 传送门 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要 ...

  3. 力扣832. 翻转图像-C语言实现-简单题

    题目 传送门 文本 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...

  4. 力扣896. 单调数列-C语言实现-简单题

    题目 传送门 文本 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j, ...

  5. 力扣算法题—069x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  6. LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组   中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...

  7. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  8. 力扣—Reorder List(重排链表)python实现

    题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...

  9. 力扣 ——Linked List Cycle II(环形链表 II) python实现

    题目描述: 中文: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). ...

  10. 力扣——Linked List Cycle(环形链表) python实现

    题目描述: 中文: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...

随机推荐

  1. C语言中的强制转换

    许久没有遇到的问题   C语言真是博大精深,越使用它,就越发感觉到它的威力和恐怖,最近在做算法的时候,遇到了一个强转的错误,把人折腾的够受,这次要好好梳理一下了,希望下次不能再犯此类的问题. 强制转换 ...

  2. Markdown表情参考

    emoji-github 文章内容来源 https://github.com/hoangdqvn/emoji-github/blob/master/README.md ️ Emoji-GIT Peop ...

  3. 1、Azure Devops之什么是Azure DevOps

    什么是Azure DevOps 1.师出名门:是微软推出的一个集项目管理.开发管理.测试管理的一个服务套件. 2.历史:前身是微软在2005年推出的Team foundation Server一个专门 ...

  4. [Raspberry Pi]树莓派多线程下串口收发数据

    [Raspberry Pi]树莓派多线程下串口收发数据 鼠鼠用的是python开发树莓派,因为python是最优美的语言! 少废话,直接上代码: import threading import ser ...

  5. 记录--怎么实现一个3d翻书效果

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本篇主要讨论以下两种翻书动画的实现: 第一种是整页翻转的效果: 这种整页翻转的效果主要是做rotateY的动画,并结合一些CSS的3d属性 ...

  6. 记录-JS 基础知识大全

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1.通过javascript向文档中输出文本 document是javascript的内置对象,代表浏览器的文档部分 document.w ...

  7. Jmeter前言

    前言 为什么要撰写这样一个教程呢? 深入学习Jmeter 温故而知新.尽管我已经使用JMeter很长时间,但还有许多元件我并不十分了解,因此,编写教程的过程成为了我的学习过程,通过反复回顾和整理知识, ...

  8. 使用OHOS SDK构建libsamplerate

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://github.com/libsndfile/l ...

  9. Java中IO和NIO的本质和区别

    目录 简介 IO的本质 DMA和虚拟地址空间 IO的分类 IO和NIO的区别 总结 简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外 ...

  10. HMS Core助力开发者打造高品质游戏,共创智玩新生态

    2021年8月1日,华为HMS Core.Sparkle游戏应用创新沙龙在上海举行.会上,华为HMS Core团队与游戏行业开发者围绕3D图形渲染.网络加速.精准运营等多个话题,探讨了游戏应用开发技术 ...