首页 > 其他分享 >LeetCode> 69. 求x的平方根

LeetCode> 69. 求x的平方根

时间:2023-06-09 10:56:44浏览次数:45  
标签:int 整数 LeetCode x2 69 平方根 x1 迭代法

目录

题目

地址:LeetCode 69. x的平方根

题目描述

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例1:

输入:x = 4
输出:2

示例2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

  • 0 <= x <= 231 - 1

解题思路

  • 方法一 暴力搜索

遍历[1, √x],找到最后一个i,满足i*i <= x,i即为所求。

    // 方法1:暴力搜索
    int mySqrt1(int x) {
        if (x <= 1) return x;

        long long i;
        for (i = 1; i * i <= x; ++i) {
        }

        if (i * i == x) return i;
        return i - 1;
    }
  • 方法二 二分法

求x平方根 <=> 求f(t) = t * t - x = 0的正根
由于f(t)是定义在[0, +∞)上的单调连续函数,因此可以找一个区间[a, b],然后不断缩小范围,来逼近f(t)=0位置。
要求f(a) * f(b) < 0,这样根t0必位于[a, b]。

可以取m = (a+b)/2,
当f(m) = 0,说明找到根了,m即为所求;
当f(m) < 0,说明a太小了,可以右移,让a=m+1;
当f(m) > 0,说明b太大了,可以左移,让b=m-1。

不断重复上面的取值,直到a > b,这样最后一个满足条件的m即为所求。

    // 方法2: 二分法 在[0, x]找k, 使得k = sqrt(x) <=> k * k = x,
    // ∵k是整数 ∴只保留整数t, 去掉小数部分
    // ∴t*t <= k*k = x
    // x平方根, 等价于求f(x) - x*x = 0的
    int mySqrt2(int x) {
        if (x <= 1) return x;
        int left = 0, right = x, mid;
        int res = x;

        while (left <= right) {
            long mid = left + (right - left) / 2;
            if (mid * mid <= x) {
                res = mid;
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
        }
        return res;
    }
  • 方法三 牛顿迭代法

对于f(x)=0求根问题,
求解方法:
x2 = x1 - f(x1)/f'(x1)

不断迭代求解x1,x2,终止条件:|x2 - x1| < eps,eps是定义的精度,通常是一个比较小的浮点数

    // 方法3:牛顿迭代法
    // x2 = x1 - f(x1)/f'(x1), f(x) = x*x - n
    // 求n平方根, 转为求f(x) = 0的正根. 这里的n就是题目中输入x
    // 而f'(x) = 2x
    // => x2 = x1 - (x1*x1-n)/(2x1)
    //       = 1/2 (x1 + n/x1)
    // 含义: 通过对接近零点的领域点做切线, 不断逼近零点, 最终十分靠近零点
    // 初始点, 可以任意取, 只要在合法范围内即可[0, +∞), 这里取x0=x
    int mySqrt(int x) {
        if (x <= 1) return x;
       
        double x0 = x, n = x;
        double x1 = x0;
        static constexpr double eps = 1e-7;
        while (true) {
            double x2 = 0.5 * (x1 + n / x1);
            if (fabs(x2 - x1) < eps) {
                break;
            }
            x1 = x2;
        }
        return static_cast<int>(x1);
    }

参考

用“牛顿迭代法”求根号2的近似值
牛顿迭代法求解平方根

标签:int,整数,LeetCode,x2,69,平方根,x1,迭代法
From: https://www.cnblogs.com/fortunely/p/17468546.html

相关文章

  • 【LeetCode滑动窗口专题#2】无重复字符的最长子串
    #1传送门滑动窗口最大值长度最小的子数组无重复字符的最长子串给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。示例1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:......
  • #yyds干货盘点# LeetCode程序员面试金典:单词接龙
    题目:字典 wordList中从单词beginWord 和endWord的转换序列是一个按下述规格形成的序列 beginWord->s1 ->s2 ->...->sk:每一对相邻的单词只差一个字母。 对于 1<=i<=k 时,每个 si 都在 wordList 中。注意,beginWord 不需要在 wordList 中。sk ==endW......
  • #yyds干货盘点# LeetCode程序员面试金典:数字范围按位与
    1.简述:给你两个整数left和right,表示区间[left,right],返回此区间内所有数字按位与的结果(包含left、right端点)。 示例1:输入:left=5,right=7输出:4示例2:输入:left=0,right=0输出:0示例3:输入:left=1,right=2147483647输出:02.代码实现:classSolution{pu......
  • LeetCode 2116. 判断一个括号字符串是否有效
    importjava.util.ArrayDeque;importjava.util.Deque;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;/***一个括号字符串是只由'('和')'组成的非空字符串。如果一个字符串满足下面任意一个条件,那么它就是有......
  • LeetCode 剑指 Offer 65. 不用加减乘除做加法
    /***写一个函数,求两个整数之和,要求在函数体内不得使用“+”、“-”、“*”、“/”四则运算符号。*<p>*示例:*输入:a=1,b=1*输出:2*<p>*提示:*a,b均可能是负数或0*结果不会溢出32位整数**00000001*00000101**进位和0......
  • LeetCode----回溯
    1算法模板for选择in选择列表:#做选择将该选择从选择列表移除路径.add(选择)backtrack(路径,选择列表)#撤销选择路径.remove(选择)将该选择再加入选择列表2代码示例46.全排列classSolution:def__init__(self):se......
  • LeetCode----前缀和
    1算法原理适用场景:利用preSum数组,可以在O(1)的时间内快速求出nums任意区间[i,j]内的所有元素之和sum(i,j)=preSum(j+1)-preSum[i]算法模板classNumArray:def__init__(self,nums:List[int]):N=len(nums)self.preSum=[0]*(N+1)......
  • LeetCode----二维网格DFS
    1算法模板voiddfs(int[][]grid,intr,intc){//判断basecase//如果坐标(r,c)超出了网格范围,直接返回if(!inArea(grid,r,c)){return;}//访问上、下、左、右四个相邻结点dfs(grid,r-1,c);dfs(grid,r+1,c);......
  • 【Leetcode】5-最长回文子串
    1.一般方法:暴力for循环求解,时间复杂度,空间复杂度。2.动态规划:我们发现在匹配过程中有许多重复计算的部分,我们把这些放到一个表里保存起来会减少运算,用空间换时间。时间复杂度,空间复杂度。例如“babab”字符串对应的表为:dp[i][j]为TRUE代表字符串从i到j为回文串。判断i到j是否为回文......
  • [LeetCode] 1351. Count Negative Numbers in a Sorted Matrix
    Givena mxn matrix grid whichissortedinnon-increasingorderbothrow-wiseandcolumn-wise,return thenumberof negative numbersin grid.Example1:Input:grid=[[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]Output:8Explanation:Thereare......