新博文地址:[leetcode]Sqrt(x)
http://oj.leetcode.com/problems/sqrtx/
Compute and return the square root of x.
初看这道题目的时候,想的太简单了,以为参数是int类型,返回值是int类型,就直接用了时间复杂度为O(n)的做法,从 x/2 开始往后遍历,知道找出满足 i * i == x的数,并返回。
后来勉强想到了二分查找,但是因为int类型发生的数组越界问题,好一顿纠结。最后看了别人的算法,看到了最合口味的牛顿迭代法:
算法思想也是很简单的,用到了极限的概念(大学数学木有白学啊,看到之后还是感觉自然而然的T_T)
不罗嗦:
为了方便理解,就先以本题为例:
计算x2 = n的解,令f(x)=x2-n,相当于求解f(x)=0的解,如左图所示。
首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。
同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。
以此类推。
以这样的方式得到的xi会无限趋近于f(x)=0的解。
判断xi是否是f(x)=0的解有两种方法:
一是直接计算f(xi)的值判断是否为0,二是判断前后两个解xi和xi-1是否无限接近。
经过(xi, f(xi))这个点的切线方程为f(x) = f(xi) + f’(xi)(x - xi),其中f'(x)为f(x)的导数,本题中为2x。令切线方程等于0,即可求出xi+1=xi - f(xi) / f'(xi)。
继续化简,xi+1=xi - (xi2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2。
有了迭代公式xi+1= (xi + n/xi) / 2,程序就好写了。
public int sqrt(int x) { if(x <= 1){ return x; } return newTon(x); } private int newTon(int x){ int result = 0; double pre = x / 2 + 1; double post = (pre + x / pre)/2; while(Math.abs(pre - post) > 0.0000001){ pre = post ; post = (pre + x / pre)/2; } result = (int) (pre + post) / 2; return result; }
至于二分法,资源很多,就不再啰嗦了。
相关推荐
javascript js_leetcode题解之第69-sqrt(x).js
# [LeetCode](https://leetcode.com/problemset/algorithms/) ![Language](https://img.shields.io/badge/language-Python%20%2F%20C++%2011-orange.svg) [![License]...
实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
《C语言入门:LeetCode第69题——求解x的平方根》 在学习C语言的过程中,通过解决实际问题可以提升编程技能,LeetCode是一个很好的实践平台。本资料主要针对LeetCode中的第69题进行讲解,这是一道关于计算平方根的...
第69题是"寻找x的平方根"(Sqrt(x)),这是一道基础但重要的算法问题,涉及到数值计算和数学优化。以下是关于这个问题的详细解析、相关知识点以及可能的Java实现方法。 **问题描述:** 给定一个非负整数`x`,求其...
第69题是“Sqrt(x)”,这是一个基础的数学问题,要求我们找到一个整数的平方根。在这个问题中,我们的目标是设计一个高效的算法来解决这个任务,而不依赖于内置的数学函数库。 C++标准库虽然提供了`sqrt`函数,位于...
- Sqrt(x): 计算并返回x的平方根,要求不使用库函数。 - Climbing Stairs: 假设你正在爬楼梯,需要n步你才能到达楼顶。每次你可以爬1或2个台阶。计算有多少种不同的方法可以爬到楼顶。 - Simplify Path: 给定一个...
实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2...
leetcode 答案 LeetCode 69 题 1.题目要求 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 示例...
069_sqrt.py # 实现开根号 136_single_number.py # 位操作:异或(xor)操作 x ^ 0 = x; x ^ x = 0 sum 001_two_sum.py # 求list中能加和成指定值的两个位置 015_3_sum**.py # 求list中能加和成0的三个值 数列 004_...
leetcode怎么销号 LeetCode-Solutions :green_heart:My own LeetCode solutions No. Problem LeetCode 力扣 ...Sqrt(x) Easy 二分、牛顿迭代 0070 Climbing Stairs Easy 动态规划 0075 Sort Colors M
在本压缩包中,我们关注的是一个Python编程与算法相关的学习资源,具体是LeetCode面试题的第69题——求解整数x的平方根。LeetCode是一个广受欢迎的在线平台,它提供了各种编程挑战,尤其是对于准备求职面试的程序员...
在本压缩包中,我们关注的是一个Python编程与LeetCode面试相关的主题——“有效的完全平方数”。这是一道常见的算法问题,通常出现在数据结构和算法的面试中,尤其是在使用Python进行编程面试时。LeetCode是一个在线...
11.2 Sqrt(x) 12. 贪心算法 12.1 跳台阶游戏 12.2 买卖股票的最佳时机 12.2.1 最多允许交易一次 12.2.2 可以交易任意多次 12.2.3 最多可以交易两次 12.2.4 可以交易任意多次 12.2.5 交易后需要停止一段时间 12.3 ...
第 343 章LeetCode解题笔记 代码请于src目录笔记见笔记目录下文档README 不更新了,直接提交。。。...69.Sqrt(x) 48.旋转图像 2017.10.30 46.排列 2017.10.29 40.组合和II 39.组合和112.路径和 201
Sqrt(x) int mid long prod = mid * mid仍會overflow 要改成 long mid宣告才行 联合查找中的路径压缩 private int find(int x) { if (parent[x] == x) { return parent[x]; } parent[x] = find(parent[x]); // path ...
这里的距离是欧几里得距离,即 sqrt(x^2 + y^2),其中(x, y)是点的坐标。 解决方案: 1. **排序**:首先,我们需要对点集P按照它们到原点的距离进行排序。这可以通过计算每个点的欧几里得距离并使用比较函数完成。...
x 10^8次汁算,如果题目给出的时间限制カ1s,那么你选择的算法执行的计算次数最多应该在10^8量级オ有可能解决这个题目。一般O(n)的算法能解决的数据范围在n < 10^8。 O(n*logn)的算法能解决的数据范围在n <= 10...
69.Sqrt(x); 300.LongestIncreasingSubsequence。 338. 计数位数419. 棋盘中的战舰461. 汉明距离476.数字补码500.键盘排93.恢复IP地址344.反向字符串463.岛屿周长485.最大连续数513. 查找左下树值406.按高度重构队列...