LeetCode每日一题

69. x 的平方根


实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
链接: https://leetcode-cn.com/problems/sqrtx/.

这道题在leetcode上是一道easy难度的题,因此我们首先可以对其进行暴力求解。暴力求解过程比较简单,遍历1-x,找到平方数大于x的数,最后返回i - 1即可。

//暴力求解
public int mySqrt(int x) {
        if(x <= 1) return x;
        int i = 1;
        while(i < x){
            //这里是<=的原因是因为有的平方数是等于x的,为了返回方便,所以将=也包括在内
            //这里写i <= x/i的原因是怕i*i的时候会越界
            if(i <= x / i) i++;
            else break;
        }
        return i - 1;
    }

第二种方法即为最常见的二分查找了,因此我们可以直接套二分查找的模板(之前写山脉数组时写了二分查找的模板)。

//二分查找
public int mySqrt(int x) {
        if(x == 0) return 0;
        int left = 1, right = x;
        while(left <= right){
        //这里这样求mid也是为了防止越界
            int mid = left + (right - left) / 2;
            long sqrt = (long)mid * mid;
            if(sqrt == x) return mid;
            else if(sqrt > x) right = mid - 1;
            else left = mid + 1;
        }
        //此处返回right,这里需要更加注意,不懂的话,可以debug尝试一下,也可以是left - 1
        return right;
    }

在写完这道题时,突然想起来有一道类似的题,因此就一并做了一遍。并且也多学习了一个算法知识。

50、Pow(x,n)


实现 pow(x, n) ,即计算 x 的 n 次幂函数。
链接: https://leetcode-cn.com/problems/powx-n/.

这道题其实库函数里面有pow函数,但是我们是以学算法为目的,因此我们需要去了解如何去实现。
在题解上看到一句话:这道题考察的是快速幂算法,不会快速幂这道题就很难做出来。因此专门的去找了快速幂的资料查看。
此处贴上学习快速幂博客的链接:https://blog.csdn.net/liangllhahaha/article/details/82119378?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.

通过学习上面链接里快速幂的知识,相信这道题应该就不是太困难了。

public double myPow(double x, int n) {
        double ans = 1, base = x;
        int temp_n = n;
        while(n != 0){
            if((n & 1) != 0){
                ans *= base;
            }
            base *= base;
            //此处需要特别注意为什么不写n >>= 2,因为可能会出现负指数
            n /= 2;
        }
        //最后返回也需要注意的是幂指数是正数还是负数
        return temp_n >= 0 ? ans : 1/ans;
    }

你可能感兴趣的:(leetcode)