69. x 的平方根

目录

一、问题描述

二、解题思路

三、代码

四、复杂度分析


一、问题描述

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

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

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

二、解题思路

要计算非负整数 x 的算术平方根并返回整数部分,可以使用二分查找法。核心思想是在可能的范围内(0 到 x)找到最大的整数 mid,使得 mid² ≤ x。通过不断缩小搜索范围,最终得到结果。

步骤

  1. 初始化边界:左边界 left 设为 0,右边界 right 设为 x。

  2. 二分查找

    • 计算中间值 mid。

    • 比较 mid² 与 x 的大小,调整边界以缩小范围。

  3. 返回结果:循环结束时,right 即为所求的整数平方根。

三、代码

class Solution {
public:
    int mySqrt(int x) {
        if(x == 0) return 0;                            //处理x=0的特殊情况
        int left = 1,right = x;                         //初始化左右指针,左指针从1开始避免除以0

        while(left <= right)
        {
            int mid = left + (right - left)/2;          //防止溢出
            long long mid_sq = (long long)mid * mid;    //计算mid的平方,转换为长整型避免溢出
            if(mid_sq == x)
            {
                return mid;                             //找到精确平方根
            }else if(mid_sq < x){
                left = mid + 1;                         //结果可能在右半部分
            }else{
                right = mid - 1;                        //结果可能在左半部分
            }
        }
        return right;                                   //返回right,此时为最大整数满足平方<=x
    }
};

四、复杂度分析

时间复杂度:O(log x),二分查找每次将范围缩小一半。
空间复杂度:O(1),仅使用常数空间。

你可能感兴趣的:(LeetCode,算法,数据结构,c++,leetcode)