LeetCode 69 x 的平方根

链接:https://leetcode-cn.com/problems/sqrtx

实现 int sqrt(int x) 函数。

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

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

示例 1:

输入: 4
输出: 2

示例 2:

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

这道题是一道经典的用二分来解的题,二分有两个模版,当所求的性质在右边的时候,用模版1,当所求性质在左边的时候,用模版2.

二分的流程是首先定义解所在区间的边界,在这道题中,l = 0, r = x. 然后编写二分的框架,其实是求mid的运算。然后设计一个检查性质是否满足的条件,这个条件一定要满足答案在性质的边界点上。我们用 result2 <= x , 当result在[0, 向下取整(sqrt(x))]的范围时,性质满足,当result在[向下取整(sqrt(x))+1, x]的范围时,性质不满足,因此check函数是符合条件的。然后判断一下区间如何更新,在这道题中所求的性质在左边,因此我们用模版2,所以更新方式为l = mid, r = mid - 1。并且当使用模版2时,在算mid的时候要加上1。

 1 class Solution {
 2 public:
 3     int mySqrt(int x) {
 4         int l = 0, r = x;
 5         while(l < r){
 6             int mid = l + (long long)r + 1 >> 1;
 7             if(mid <= x / mid) l = mid;
 8             else r = mid - 1;
 9         }
10         return r;
11     }
12 };

这个代码要注意的地方还是挺多的,一个是在check函数的地方,第7行中如果用mid * mid <= x 会出现溢出的情况,另一个是在第6行,当r = x 时,mid也会出现溢出的情况,所以要把r的数据类型改成long long。最后要注意的地方是右移符号,如果不熟练,很容易写成左移。一个记忆的窍门是,箭头指向哪边,就往哪移,而且记得除以2是右移一位!

原文地址:https://www.cnblogs.com/hellosnow/p/11576639.html

时间: 2024-10-29 00:44:52

LeetCode 69 x 的平方根的相关文章

leetcode 69. x 的平方根(Sqrt(x))

目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去. 解法: class Solution { public: int mySqrt(int x) { if(x == 0 |

leetcode 69.x的平方根(Java 二分查找 easy)

https://leetcode-cn.com/problems/sqrtx/ 实现int sqrt(int x)函数,给定一个数字,求sqrt(x)并且保留整数部分. 二分查找,令l=1,h=x,判断l<=h,当跳出循环时,即sqrt(x)不为整数时,return h,因为跳出循环时l>h,本题要求只保留整数部分,不四舍五入. class Solution { public int mySqrt(int x) { if(x<=1) return x; int l=1,h=x; whil

leetcode——69.x的平方根

超出时间限制.. 1 class Solution: 2 def mySqrt(self, x: int) -> int: 3 for i in range(0,x//2+2): 4 if x>=i**2 and x<(i+1)**2: 5 return i 好气哦...加油想想怎么改进... 修改以后通过,但是还是太好,修改了将近40分钟,好没有效率啊: 1 class Solution: 2 def mySqrt(self, x: int) -> int: 3 i=x 4 m=

LeetCode --- 69. Sqrt(x)

题目链接:Sqrt(x) Implement int sqrt(int x). Compute and return the square root of x. 这道题的要求是实现int sqrt(int x),即计算x的平方根. 考虑二分,即先令l和r分别为1和x/2+1(x的平方根一定小于等于x/2+1),然后m等于(l+r)/2,不断比较m*m和x的大小. 由于m*m的时候,可能溢出,因此可以用除法代替乘法,或者采用long long类型. 时间复杂度:O(logn) 空间复杂度:O(1)

leetcode 69题 思考关于二分查找的模版

leetcode 69, Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a non-negative integer. Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is retu

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

Leetcode 69. Sqrt(x) Easy https://leetcode.com/problems/sqrtx/ Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a non-negative integer. Since the return type is an integer, the decimal digits are truncat

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

69. Sqrt(x) Total Accepted: 93296 Total Submissions: 368340 Difficulty: Medium 提交网址: https://leetcode.com/problems/sqrtx/ Implement int sqrt(int x). Compute and return the square root of x. 分析: 解法1:牛顿迭代法(牛顿切线法) Newton's Method(牛顿切线法)是由艾萨克·牛顿在<流数法>(M

2019年3月31日 LeetCode——69 Java之 x 的平方根

题目要求: 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842...,   由于返回类型是整数,小数部分将被舍去.思路:题目要求实现x的平方根,最后结果只保留整数部分.很容易的想到用二分法.代码示例: class Solution { public int mySqrt(int x

LeetCode题解——69. x 的平方根(C语言)

原题链接: https://leetcode-cn.com/problems/sqrtx/ 题目: 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数.由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去. 思路: 使用二分查找. 因为一个数的平方肯定不会超过它自己且最多不会超过它的一半,所