【力扣】x 的平方根 学霸题你学废了么?

简介: 【力扣】x 的平方根 学霸题你学废了么?

题目描述


给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

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

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。


示例


示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2

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

 

提示:

0 <= x <= 2312^{31}231 - 1

题目分析


为什么越刷题越觉得自己数学学的拉胯呢?

由于x平方根的整数部满足 k2k^{2}k2x的最大k值,因此我们可以对k进行二分查找,从而得到答案。


思路讲解


这部分不算原创,是学习了力扣官方的解题思路后,归纳总结的:


  1. 二分查找的下界为0,上界可以粗略地设定为x。
  2. 在二分查找的每一步中,我们只需要比较中间元素mid的平方与x的大小关系
  3. 通过比较的结果调整上下界的范围
  4. 因为我们所有的运算都是整数运算,不会存在误差
  5. 因此在得到最终的答案ans后,也就不需要再去尝试ans+1了


AC代码


func mySqrt(x int) int {
    l, r := 0, x
    ans := -1
    for l <= r {
        mid := l + (r - l) / 2
        if mid * mid <= x {
            ans = mid
            l = mid + 1
        } else {
            r = mid - 1
        }
    }
    return ans
}


运行结果

微信图片_20221112172611.jpg



总结


复杂度分析


时间复杂度:O(logx),二分查找需要的次数。

空间复杂度:O(1)。

相关文章
|
8月前
|
JavaScript 前端开发 C语言
leetcode每日一题 2021/4/1 1006. 笨阶乘
leetcode每日一题 2021/4/1 1006. 笨阶乘
29 0
|
3天前
力扣每日一题 6/11 暴力搜索
力扣每日一题 6/11 暴力搜索
5 0
|
2月前
每日一题(珠玑妙算,两数之和)
每日一题(珠玑妙算,两数之和)
23 1
|
2月前
|
存储
每日一题啦(● ̄(エ) ̄●)(尼克切斯定理,等差数列)
每日一题啦(● ̄(エ) ̄●)(尼克切斯定理,等差数列)
13 0
|
2月前
|
算法 C++ 机器人
力扣 C++|一题多解之动态规划专题(1)
力扣 C++|一题多解之动态规划专题(1)
48 0
力扣 C++|一题多解之动态规划专题(1)
|
2月前
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
44 0
力扣 C++|一题多解之动态规划专题(2)
LeetCode每日一题(23)——最大三角形面积
最大三角形面积 1.题目 2.示例 3.思路 4.代码 暴力穷举 凸包
LeetCode每日一题(23)——最大三角形面积
LeetCode每日一题(1)——最大回文数乘积
LeetCode每日一题(1)最大回文数乘积 1.题目 2.示例 3.思路 1.生成位数符合要求的递减的回文数 2.判断回文数是否符合要求 4.代码 5.复杂度分析
LeetCode每日一题——812. 最大三角形面积
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
66 0
LeetCode每日一题——812. 最大三角形面积
|
存储 C++ 容器
蓝桥杯练习题五 - 四平方和(c++)
蓝桥杯练习题五 - 四平方和(c++)
138 0