题目:

给你一个非负整数 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. ncc - koa 后台源码加密打包工具 @vercel/ncc - webpack node打包更正规

    加个重点 webpack 打包更正规 安装 npm i -g @vercel/ncc 又发现一个 https://github.com/zeit/ncc npm i -g @zeit/ncc 卸载之前 ...

  2. 音标 重音 u 用 中文 吁 去记忆 骑马让马停下来的 吁 - 英语

    音标 重音 u 用 中文 吁 去记忆 骑马让马停下来的 吁

  3. Linux安装Nginx详细教程

    一.下载Nginx安装包 Nginx官网下载地址 根据需求选择自己需要的版本下载后上传至服务器(路径自行决定). 如果服务器有外网,可以直接在服务器上下载. wget -c https://nginx ...

  4. 三维模型OBJ格式轻量化压缩处理效率提高的技术方法探讨

    三维模型OBJ格式轻量化压缩处理效率提高的技术方法探讨 要提高三维模型OBJ格式轻量化压缩处理的效率,可以采取以下方法: 1.优化算法选择:选择合适的优化算法对模型进行轻量化处理.不同的优化算法有不同 ...

  5. Python爬虫实战系列4:天眼查公司工商信息采集

    Python爬虫实战系列1:博客园cnblogs热门新闻采集 Python爬虫实战系列2:虎嗅网24小时热门新闻采集 Python爬虫实战系列3:今日BBNews编程新闻采集 Python爬虫实战系列 ...

  6. 记录--实时音视频功能简析(live-pusher与live-player)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 使用须知 2017年下半年,微信6.5.21版本支持在线音视频功能.开发者可以通过两个音视频组件 和 实现实时地在线直播.视频通话.语音通 ...

  7. 【干货】Java开发者快速上手.NET指南

    前言 前几天有小伙伴在技术群里发了一个微软官方出的:适用于Java开发人员的.NET快速入门免费电子书,今天大姚来分享一下Java开发者想要快速上手.NET有哪些教程和优质资料. 微软适用于Java开 ...

  8. gRPC入门学习之旅(三)

    gRPC入门学习之旅(一) gRPC入门学习之旅(二) 2.3.创建自定义服务 除上面的模板中自带的一个gRPC服务之后,我们再创建一个自己的服务,我将创建一个用户信息gRPC服务,主要功能有三个,登 ...

  9. Python数据库编程全指南SQLite和MySQL实践

    本文分享自华为云社区<Python数据库编程全指南SQLite和MySQL实践>,作者: 柠檬味拥抱. 1. 安装必要的库 首先,我们需要安装Python的数据库驱动程序,以便与SQLit ...

  10. kingbaseES坏块修复功能

    1.自动坏块修复简介 主数据库访问系统表数据.索引.持久化用户表数据.索引时,从磁盘读取数据块至共享缓冲区,如果检测到坏块,自动从备节点获取坏块的副本,并修复坏块. 坏块修复相关参数 参数名称 默认值 ...