LeetCode:69. Sqrt(x)

题目链接:

69. Sqrt(x)


题目描述:

Implement int sqrt(int x)
Compute and return the square root of x.


题目解释:

提干非常简单,就是实现一个整数的求平方根的函数,输入为int,输出也是int。


解题方案:

  求一个整数的平方根,最土的办法是从0开始尝试0,1,2,3,4…判断是不是数x的平方根,但是这种方式的时间复杂度为O(n),是线性时间的,特别是运算过程中会有一个乘积需要计算,时间复杂度不符合要求,会超时。我们仔细前文最土求平方根的方式可以看到,整数x的平方根是有序数列0,1,2,3,4,5…….n中的一员,求平方根其实就是在这个有序数列[0,n]中查找出来某一个数,这样我们就把求根问题转换为了查找问题
  在有序数组中查找的高效解法为:二分查找。另外这里有个要注意的点:在最土办法中,我们使用数k的平方与x比较,从而判断是不是平方根,而二分法是不行的,因为二分法的查找不再是从小到大。第一个二分点的乘积可能会超过整数的表示范围。所以我们需要将乘法变换为除法,利用(x / mid) / mid == 0 这样的方式来判断x与 中点mid * mid乘积的大小。
  


AC代码:

class Solution {
public:
   int mySqrt(int x) {

      if ( x == 0 ) return 0;

      int low = 0;
      int high = x;
      int root = 0;

      while(low <= high) {

        int mid = (low + high) / 2;

        //刚好找到平方根,直接放回结果。
        if ( (mid != 0) && (x / mid) / mid == 0 ) {
          //mid * mid > x 的场景
          //平方根在左侧,需要在左侧递归
          high = mid - 1;

        } else {

          if ( mid * mid == x ) {
            return mid;
          }
          if ( mid * mid < x ) {
            //假设根为 当前mid,利用这种方式寻求平方和小于x的最大整数
            root =  mid;
            //平方根在右侧
            low = mid + 1;
          }
        }
      }
      return root;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值