题目:

Implement int sqrt(int x).

Compute and return the square root of x.

链接:   http://leetcode.com/problems/sqrtx/

题解:

求平方根。

二分法, Time Complexity - O(logn), Space Complexity - O(1)

public class Solution {
public int mySqrt(int x) {
if(x <= 1)
return x;
int lo = 0, hi = x; while(lo <= hi) {
int mid = lo + (hi - lo) / 2;
if(mid < x / mid)
lo = mid + 1;
else if (mid > x / mid)
hi = mid - 1;
else
return mid;
} return hi;
}
}

牛顿法

public class Solution {
public int sqrt(int x) {
if (x == 0) return 0;
double lastY = 0;
double y = 1; while (y != lastY) {
lastY = y;
y = (y + x / y) / 2;
} return (int)(y);
}
}

Bit Manipulation

public class Solution {
public int mySqrt(int x) {
long ans = 0;
long bit = 1l << 16; while(bit > 0) {
ans |= bit;
if (ans * ans > x) {
ans ^= bit;
}
bit >>= 1;
} return (int)ans;
}
}

Follow up - 求实数的平方根。 设置一个ε,然后根据差值计算

二刷:

可以用二分法或者牛顿法。

Java:

二分法:

二分法写得比较古怪,有点像背出来的, 为了避免Integer.MAX_VALUE用了 x / mid。mid不会为0,所以可以放心大胆使用。 最后返回结果时要返回的是hi, 这是 lo ^2会正好比x大。

Time Complexity - O(logn), Space Complexity - O(1)

public class Solution {
public int mySqrt(int x) {
if (x <= 1) {
return x;
}
int lo = 0, hi = x;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (mid == x / mid) {
return mid;
} else if (mid < x / mid) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
return hi;
}
}

牛顿法:

牛顿法也可以用来处理double的情况,只要把条件改为y - lastY > epsilon就可以了。一开始设x2 = a,则转化为方程y = x2 - a, 接下来右xn+1 = xn - f(x) / f'(x)。    新的y (切线逼近)等于 xn+1 = xn -  ( x2- a )  / (y的导数 = 2x),所以简化一下就等于xn+1 = (xn + a / xn) / 2,用切线进行不断逼近。

Time Complexity - O(logn), Space Complexity - O(1)

public class Solution {
public int mySqrt(int x) {
if (x <= 1) {
return x;
}
double lastY = x / 2;
double y = (lastY + x / lastY) / 2;
while (y - lastY != 0) {
lastY = y;
y = (lastY + x / lastY) / 2;
}
return (int)y;
}
}

三刷:

Java:

二分法:

public class Solution {
public int mySqrt(int x) {
if (x <= 1) return x;
int lo = 0, hi = x;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (mid == x / mid) return mid;
else if (mid < x / mid) lo = mid + 1;
else hi = mid - 1;
}
return hi;
}
}

牛顿法:

再次详述一下牛顿法。

牛顿法主要是使用切线来不断逼近方程根的方法。

  1. 首先我们有x2 = a,移动一下我们得到方程x2 - a = 0。
  2. 我们假设函数 f(x) = x2 - a, 则这个方程的切线 f'(x) = 2x,也就是切线的斜率为2
  3. 利用直线的两点式方程我们可以得到 xn+1 - x= ( 0 - f(xn) ) / f'(xn),  这里新的逼近点为(xn+1 , 0),即切线与x轴的焦点, 旧的逼近点为(xn  , f(x))。
  4. 这里我们做一下变量代换, f'(x) = 2x,  f(x) = x2 - a
  5. 我们可以得到  xn+1 - x= (a - xn2) / 2 * x, 简化一下就变成了  xn+1 = (xn + a / xn) / 2
  6. 在 xn+1 - x的差大于一个误差常数Epsilon的时候,我们就可以用while循环来不断使用切线迭代逼近方程x2 - a = 0的根, 最后就可以成功求得一个在Epsilon误差内的,方程的解。
public class Solution {
public int mySqrt(int x) {
if (x <= 1) {
return x;
}
double lastY = 1;
double y = (lastY + x / lastY) / 2;
while (y - lastY != 0) {
lastY = y;
y = (lastY + x / lastY) / 2;
}
return (int)y;
}
}

4/4/2016: 从wentao处又学习了很多东西。他是数学PHD大牛,推理和论证功力简直一级棒。

Reference:

http://www.matrix67.com/blog/archives/361

https://en.wiki2.org/wiki/Methods_of_computing_square_roots

http://www.math.harvard.edu/library/sternberg/slides/lec1.pdf

http://www.cnblogs.com/bigrabbit/archive/2012/09/25/2702174.html

69. Sqrt(x)的更多相关文章

  1. C++版 - Leetcode 69. Sqrt(x) 解题报告【C库函数sqrt(x)模拟-求平方根】

    69. Sqrt(x) Total Accepted: 93296 Total Submissions: 368340 Difficulty: Medium 提交网址: https://leetcod ...

  2. Leetcode 69. Sqrt(x)及其扩展(有/无精度、二分法、牛顿法)详解

    Leetcode 69. Sqrt(x) Easy https://leetcode.com/problems/sqrtx/ Implement int sqrt(int x). Compute an ...

  3. 69. Sqrt(x) - LeetCode

    Question 69. Sqrt(x) Solution 题目大意: 求一个数的平方根 思路: 二分查找 Python实现: def sqrt(x): l = 0 r = x + 1 while l ...

  4. [LeetCode] 69. Sqrt(x) 求平方根

    Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a no ...

  5. Leetcode 69. Sqrt(x)

    Implement int sqrt(int x). 思路: Binary Search class Solution(object): def mySqrt(self, x): "&quo ...

  6. 【一天一道LeetCode】#69. Sqrt(x)

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Impleme ...

  7. (二分查找 拓展) leetcode 69. Sqrt(x)

    Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a no ...

  8. [LeetCode] 69. Sqrt(x)_Easy tag: Binary Search

    Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a no ...

  9. 69. Sqrt(x)(二分查找)

    Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a no ...

随机推荐

  1. Laravel 5 基础(三)- 向视图传送数据(续)

    我们不仅仅可以向视图传送一个数据,同样我们可以传送Array public function about() { return view('pages.about')->with([ 'firs ...

  2. Google protobuf安装

    1:需要安装sudo apt-get install x11-apps libwayland-ltst-client0 libtxc-dxtn-s2tc0 x11-session-utils  x11 ...

  3. UIActivityIndicatorView的使用

    class ViewController: UIViewController,UIActionSheetDelegate{ @IBOutlet weak var label1: UILabel! @I ...

  4. 【iOS】Objective-C简约而不简单的单例模式

    前些日子在项目中因为误用了单例而导致了一系列问题.原来在objective-c中的单例并没有java或者C#那么简单的实现,这里记录下: 问题是这样被发现的,在对于一个UIViewController ...

  5. Daject初探 - 从Table模型得到Record模型

    前言: 如果你还不知道Daject是什么,如何使用,可以浏览 http://www.cnblogs.com/kason/p/3577359.html github地址:https://github.c ...

  6. wamp下修改mysql root用户的登录密码

    1.安装好wamp后,运行WampServer程序,进入MYSQL控制台; 2.进入控制台后,提示输入密码(不用输入任何密码,因为密码为空),按回车键进入; 3.输入“USE mysql;”然后回车, ...

  7. Week1 Team Homework #2 Introduction of team member with photos

    小组成员介绍 组长:黄剑锟       11061164 组员:顾泽鹏        11061160 组员:周辰光         11061154 组员:龚少波        11061167 组 ...

  8. iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):1 概述

    本文档尝试用Video Toolbox进行H.265(HEVC)硬件编码,视频源为iPhone后置摄像头.去年做完硬解H.264,没做编码,技能上感觉有些缺失.正好刚才发现CMFormatDescri ...

  9. Careercup - Facebook面试题 - 6321181669982208

    2014-05-02 09:40 题目链接 原题: Given a number N, write a program that returns all possible combinations o ...

  10. javacript中的mvc设计模式

    以下内容为原创翻译,翻译不对的地方还请原谅,凑合着看吧. 原文网址是: 来源:http://www.alexatnet.com/articles/model-view-controller-mvc-j ...