题目:

给你一个非负整数 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. npm 添加 淘宝代理

    npm config set registry https://registry.npm.taobao.org

  2. 基于AmbiqMicro-AMA3B2KK-KBR的可穿戴智能手环解决方案之心率测量源码解析

    一 前记 梳理该可穿戴产品的手环,产品,是一种成长.也是一个总结. 二 源码解析 1 初始化:这里主要初始化心率的检测间隔时间和心率值的位数. /* initialize heart rate pro ...

  3. KTL 一个支持C++14编辑公式的K线技术工具平台 - 第九版,数据分析工具。支持通达信日线数据。增强即时插件编程体现。

    K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...

  4. 对象池Pools优化

    目录介绍 01.什么是对象池 02.glide哪里用到对象池 03.多条件key缓存bitmap 3.1 多条件key创建 3.2 key值的复用 04.glide对象池总结 05.学以致用对象池 5 ...

  5. 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第9章

    本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录

  6. C# OpenCvSharp 轮廓检测

    效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...

  7. zynq之TF卡写入函数f_printf

    zynq之TF卡写入函数f_printf 1.基本原理 前面使用f_write写入了数据到TF(SD)卡中,可以实现较短字符串的写入.当字符增加时,容易出现乱码.而f_printf则是专门用于字符串写 ...

  8. verilog之时钟信号的编写2

    verilog之时钟信号的编写2 1.时钟信号的特点 时钟信号除了可以根据时序一个个变化列举出来,还可以利用其循环的变化的特点,使用循环执行语句always来实现.这种方法实现的时钟信号可以一直执行且 ...

  9. how to install local jar to maven repository

    如何把maven不能引入的依赖安装到本地Repository: 1.比如fastdfs-client-java. <dependency> <groupId>org.csour ...

  10. 如何在Java中读取超过内存大小的文件

    读取文件内容,然后进行处理,在Java中我们通常利用 Files 类中的方法,将可以文件内容加载到内存,并流顺利地进行处理.但是,在一些场景下,我们需要处理的文件可能比我们机器所拥有的内存要大.此时, ...