社团活动每日一题:第十三天 Sqrt(x)

前言:这是我们大学社团给我们大一新生布置的每日一题任务,因为本人编程理解有限,参考价值较低。

题目链接icon-default.png?t=LA46https://leetcode-cn.com/problems/sqrtx/        用正常语句还原Sqrt(x),看到题目直接暴力:

class Solution {
public:
    int mySqrt(int x) {
        long long i = 1,j = x;    //换成long long防止数据爆int
        while(i*i<=j)i++;
        return i-1;
    }
};

        其实我没想到这样能过......但想了想,int上限是2^31-1,众所周知2^10=1024≈10^3,所以int的上限还可近似表示为2*10^9,开个平方根就连10w都不到,的确能过的......

        我本来是想提出一种用二分法来查找的方法的,但没想到根本用不上。但我还是把二分法写法写出来吧:

class Solution {
public:
    long long n;
    bool judge(long long c){
        return (c*c <= n && (++c)*c > n);
    }
    long long Dic(long long L,long long R){
        long long c = (L+R)/2;
        if(c*c>n)return Dic(L,c);
        if(judge(c))return c;
        return Dic(c,R);
    }
    int mySqrt(int x) {
        n = (long long)x;
        return (int)Dic(1,n);
    }
};

这样的时间复杂度是O(log2(n)),最多计算三十多次就可以得出答案,比暴力快上不少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值