LeetCode小白菜笔记[17]:Sqrt(x)

69. Sqrt(x) [easy]

Implement int sqrt(int x).

Compute and return the square root of x.

x is guaranteed to be a non-negative integer.

Example 1:

Input: 4
Output: 2

Example 2:

Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since we want to return an integer, the decimal part will be truncated.

题目要求很简单,就是对整数开根号。

先试试最枚举的暴力方法,看看有没有时间限制:

class Solution(object):def mySqrt(self, x):""":type x: int:rtype: int"""i = 0while (i+1) * (i+1) <= x:i += 1return i

time limit excess 。。。果然有时间限制。考虑其他方法。实际上这就是一个对于从0~n的整数里面查找满足条件的整数的问题,既然是查找,那就可以二分来做。另外,考虑这个问题可以看做是函数求零点,或者说是方程求根问题,而且要求是整数,对精度要求这么低,可以牛顿迭代。

考虑牛顿迭代,对于 f(x)=0 f ( x ) = 0 f(x) = 0 ,可以构造 y=f(x) y = f ( x ) y = f(x),求其零点。对于一个guess,比如 x0 x 0 x_0,那么有在此处的切线:

y=f′(x0)(x−x0)+f(x0) y = f ′ ( x 0 ) ( x − x 0 ) + f ( x 0 )

y = f^{'}(x_0)(x-x_0)+f(x_0)

点斜式方程,这个线性方程的零点就是:

x=−f(x0)f′(x0)+x0 x = − f ( x 0 ) f ′ ( x 0 ) + x 0

x = -\frac{f(x_0)}{f^{'}(x_0)}+x_0

如果我们对于这个零点作为下一个guess,重复以上步骤,这就是牛顿迭代,所以上式中的 x x x和x0" role="presentation" style="position: relative;">x0x0x_0可以写成 xn+1 x n + 1 x_{n+1}和 xn x n x_n,就变成了迭代公式。对于本问题,一个特例就是:

y=f(x)=x2−a y = f ( x ) = x 2 − a

y=f(x) = x^2 - a ,其中a就是我们要求根的那个数字。所以迭代公式为:

xk+1=12(xk+axk) x k + 1 = 1 2 ( x k + a x k )

x_{k+1} = \frac{1}{2}(x_k+\frac{a}{x_k})

以a为第一次guess,可以迭代,因为精度要求是整数部分即可,又由于牛顿迭代的误差是越来越小的,又因为二次函数是凸的,切线应该在下面,所以数值应该是逐渐减小的,因此找到第一个整数部分的平方小鱼等于a的即可,code如下:

class Solution(object):def mySqrt(self, x):""":type x: int:rtype: int"""rt = xwhile int(rt) * int(rt) > x:rt = 0.5 * ( rt + x / rt )return int(rt)

就这几句。。。结果通过。但是比较慢,125ms,超过百分之4.5,后来发现,第一个guess不必从x开始,可以从x/2+1即可,再测试,结果:

69ms,12.17%,还是比较慢,但是有提高。

2018年2月10日01:45:36

夜深了,睡觉~

LeetCode小白菜笔记[17]:Sqrt(x)相关推荐

  1. LeetCode小白菜笔记[3]:Palindrome Number

    LeetCode小白菜笔记[3]:Palindrome Number 9. Palindrome Number [Easy] 题目:Determine whether an integer is a ...

  2. LeetCode小白菜笔记[1]:Two Sum

    LeetCode小白菜笔记[1]:Two Sum 1. Two Sum [Easy] 题目: Given an array of integers, return indices of the two ...

  3. springmvc学习笔记(17)-上传图片

    2019独角兽企业重金招聘Python工程师标准>>> springmvc学习笔记(17)-上传图片 标签: springmvc [TOC] 本文展示如何在springmvc中上传图 ...

  4. 2020-4-5 深度学习笔记17 - 蒙特卡罗方法 3 ( 马尔可夫链蒙特卡罗方法MCMC-先验分布/后验分布/似然估计,马尔可夫性质)

    第十七章 蒙特卡罗方法 中文 英文 2020-4-4 深度学习笔记17 - 蒙特卡罗方法 1 (采样和蒙特卡罗方法-必要性和合理性) 2020-4-4 深度学习笔记17 - 蒙特卡罗方法 2 ( 重要 ...

  5. 经济学人精读笔记17:无现金时代,电子支付大势所趋

    # 经济学人精读笔记17:无现金时代,电子支付大势所趋 标签(空格分隔): 经济学人 Part 1 The dash off cash Rich countries must start planni ...

  6. leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排

    leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...

  7. [leetcode 面试题 17.17] -- 多次搜索,KMP与字典树

    [leetcode 面试题 17.17] -- 多次搜索 题目来源 分析 KMP思路 完整代码 字典树 完整代码 题目来源 https://leetcode-cn.com/problems/multi ...

  8. 华为HCIA-datacom 学习笔记17——IPv6基础

    华为HCIA-datacom 学习笔记17--IPv6基础 IPv6基础 1.ipv4与ipv6 地址长度32bit IPv6:IP地址长度128bit IPv4包头(20byte~60byte) I ...

  9. 【计算机网络学习笔记17】网络安全、加密技术、“Virtual Private Network”技术

    [计算机网络学习笔记17]网络安全.加密技术."Virtual Private Network"技术 一.网络安全概述 1.1 网络系统的安全目标: 1.可用性(Availabil ...

最新文章

  1. Fedora 从 15.0 开始将修改以太网卡命名规则
  2. linux resolv.conf详解
  3. 内存泄露调试工具visualleakdetector使用方法
  4. java超出gc开销_通过这5个简单的技巧减少GC开销
  5. 上海政府版WINXP真相大揭秘
  6. 苹果mac微软表格处理工具:microsoftexcel
  7. 中国全国行政区代码表
  8. 二十年经典港台电视剧回顾
  9. BAT 批处理注释命令rem、@rem和::
  10. 基于STM32F103的多种波形示波器制作
  11. 10行代码实现抽奖助手自动参与抽奖
  12. 嵌入式Linux系统工程师系列之ARM920T的MMU与Cache
  13. Java游戏项目之黄金矿工
  14. (LINPACK)HPL测试成功步骤整理
  15. vscode 删除的文件如何找回??
  16. fpc软性线路板生产工艺
  17. K-近邻算法全面解析
  18. 第一章-总论财务管理概述
  19. isp,iap,sw-jtag
  20. solo 电路 耳放_Graham Slee SOLO 耳机放大器发展史

热门文章

  1. 皮肤检测仪_毛囊检测仪_口腔內窥镜
  2. python找数字、做加法_Python数学1-2:理解数字——自然数加法,python,12,认识
  3. python 医学文献检索(包括文献图片中的文字)
  4. win32 zbar
  5. C#中的#region
  6. arch 的相关操作
  7. 位图文件(BMP)格式以及Linux下C程序实现
  8. 微信小程序 第一次授权失败 第二次授权成功
  9. CUDA RUNTIME
  10. IBM花300万美元打造互联网三维虚拟紫禁城