LeetCode #69 x的平方根

题目描述

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

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

示例 1:

输入: 4
输出: 2

示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

方法一:二分查找

一个数 x 的开方 sqrt 一定在 0~x 之间,并且满足 sqrt == x // sqrt。可以利用二分查找在 0~x 之间查找
循环条件为 l <= h ,所以 h 总是比 l 小1,这道题是向下取整的,直接找到的会直接退出,所以返回值应该是 h 而不是 l

class Solution:def mySqrt(self, x: int) -> int:# 0和1直接返回,那么就在1~x-1中查找if x <= 1:return xl = 1; h = x - 1while l <= h:m = l + (h - l) // 2sqrt = x // mif sqrt == m:return melif sqrt > m:l = m + 1else:h = m - 1return h
  • 时间复杂度:O(logN)O(logN)O(logN)
  • 空间复杂度:O(1)O(1)O(1)

方法二:牛顿法

使用牛顿法可以得到一个正实数的算术平方根,公式为:xk+1=12[xk+xxk]x_{k+1}=\frac{1}{2}[x_k+\frac{x}{x_k}]xk+1​=21​[xk​+xk​x​]
具体解析可以看 @iweiwei1419 二分查找 + 牛顿法(Python 代码、Java 代码)

  • 1e-6 是科学计数法,表示 111 乘以 101010 的负 666 次方,也就是 0.0000010.0000010.000001。有的地方使用 epsilon(ϵ)(\epsilon)(ϵ)表示 1e-6 ,用来抵消浮点运算中因为误差造成的相等无法判断的情况,它通常是一个非常小的数字,具体多小要根据你的精度需求来设置。
class Solution:def mySqrt(self, x):if x < 0:raise Exception('不能输入负数')if x == 0:return 0# 起始的时候在 1 ,这可以比较随意设置cur = 1while True:pre = curcur = (cur + x / cur) / 2if abs(cur - pre) < 1e-6:return int(cur)# 作者:liweiwei1419
# 链接:https://leetcode-cn.com/problems/sqrtx/solution/er-fen-cha-zhao-niu-dun-fa-python-dai-ma-by-liweiw/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 时间复杂度:O(logN)O(logN)O(logN)
  • 空间复杂度:O(1)O(1)O(1)

值得一提的是,虽然时间复杂度都是 O(logN)O(logN)O(logN),但是牛顿法会比第一种性能能好,因为牛顿法是二次迭代的

LeetCode #69 x的平方根 二分查找相关推荐

  1. LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根

    LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根 题目描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型 ...

  2. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  3. LeetCode 69. x 的平方根(二分查找)

    文章目录 1. 题目 2.解题 2.1 二分查找 2.2 牛顿迭代 1. 题目 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果 ...

  4. 【Leetcode | 顺序刷题 】二分查找目录

    二分查找 序号 题号 1 29. 两数相除   50. Pow(x, n)   69. x 的平方根                                                   ...

  5. LeetCode - 69. x 的平方根

    69. x 的平方根 class Solution {private static final Integer MAX_POW = 46340;/*** 牛顿迭代* f(x) = x^2 - n* 切 ...

  6. LeetCode算法题4:二分查找及扩展应用

    文章目录 前言 一.二分查找 二.第一个错误的版本 三.搜索插入位置 总结 前言 Leetcode算法系列:https://leetcode-cn.com/study-plan/algorithms/ ...

  7. LeetCode 1891. 割绳子(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个整数数组 ribbons 和一个整数 k,数组每项 ribbons[i] 表示第 i 条绳子的长度. 对于每条绳子,你可以将任意切割成一系列长度为 ...

  8. LeetCode 911. 在线选举(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 在选举中,第 i 张票是在时间为 times[i] 时投给 persons[i] 的. 现在,我们想要实现下面的查询函数: TopVotedCandida ...

  9. LeetCode 162. 寻找峰值(二分查找)

    1. 题目 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返回任何一 ...

最新文章

  1. 【Codeforces】659B Qualifying Contest (sort)
  2. 约瑟夫环的问题--剑指 Offer 62. 圆圈中最后剩下的数字
  3. win10安装net3.5不成功出现 0x8024402c_在移动硬盘中安装win10和macos双系统
  4. 当代成年人的生活状态......
  5. 全国计算机等级考试用报名吗,全国计算机等级考试网上报名流程及考生报名使用说明...
  6. RT-Thread下的串口驱动程序分析
  7. java工作笔记019---java8新特性判断非null
  8. 数据持久化mysql_Nacos数据持久化到MySQL
  9. 问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应——以回旋体的“基本曲线”为例(2)
  10. 建立个人腾讯云服务器
  11. pytorch创建新环境
  12. 关于手机-Android版本-基带版本,连续点击六次进入工厂模式。自定义版本点五次动态隐藏显示某应用。
  13. 保姆级教学!Xcode 配置 OpenGL 环境
  14. Linux select函数的使用
  15. Kettle闪退,以及Kettle资源库connect报错小解
  16. 聚类 k-means、yellowbrick和信用卡用户实例 -- 023
  17. [OTA-day3SPI]W25Q64擦写
  18. linux下运行eureka,Linux服务器重启后eureka报错
  19. Windows MongoDB 安装及配置
  20. SEO的图片优化和关键词

热门文章

  1. 芝法酱躺平攻略(4)—— powerdesigner与mybatis-plus生成代码
  2. python 实现翻译功能
  3. linux python乱码_linux下python中文乱码解决方案详解
  4. 关于java过滤微信emoji表情的问题解决方法
  5. 6-7 能被7或11整除的所有整数
  6. gs 标准不变的前提应变
  7. 什么软件去图片水印不留痕迹?三款图片去水印软件分享
  8. zbrush插件布尔运算插件perfectbool安装方法
  9. 专科计算机女生就业率,2021女孩就业率最好的专业
  10. python毕业设计作品基于django框架 校园失物招领系统毕设成品(7)中期检查报告