【LeetCode】第69题——x的平方根(难度:简单)

【LeetCode】第69题——x的平方根(难度:简单)

题目描述

实现 int sqrt(int x) 函数。

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. 示例1
    输入: 4
    输出: 2

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

解题思路

不用sqrt()函数求解,很容易想到的方法是从1到n寻找一个数i,使得i的平方小于等于n且(i+1)的平方大于n。而对于有序数列的查找,二分法是一种不错的方法。

当然你也会细心地发现,除1以外,其它自然数在整除2之后再平方会大于本身,因此一开始的范围可以不用设定为0~n,而是设置为0~(n整除2)。

代码详解

class Solution {
    public int mySqrt(int x) {
        int p = 0;		// 左指针
        int q = x / 2;	// 右指针
        int ans = 0;	// 结果
        int mid = 0;	// 二分法查询
        if(x == 1) {
            return 1;	// 把特殊情况1排除
        }
        while(p <= q) {	// 寻常的二分法代码
            mid = (p + q) / 2;
            if ((long)mid * mid <= x) {	// long防止平方超出int范围
                ans = mid;
                p = mid + 1;
            } else {
                q = mid - 1;
            }
        }
        return ans;
    }
}

注意点

  1. 可以缩小初始查找范围(但也只是减少了二分法查询操作的第一步)
  2. 注意int的平方的越界问题
  3. 也可用幂指数与对数的关系不讲武德式的直接计算出结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值