《LeetCode之每日一题》:45.2 的幂

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:45.2 的幂相关的知识,希望对你有一定的参考价值。


题目链接: 2 的幂

有关题目

给你一个整数 n,请你判断该整数是否是 2 的幂次方。
如果是,返回 true ;否则,返回 false 。

如果存在一个整数 x 使得 n == 2^x ,则认为 n 是 2 的幂次方。
示例 1:

输入:n = 1
输出:true
解释:2^0 = 1

示例 2:

输入:n = 16
输出:true
解释:2^4 = 16
示例 3:

输入:n = 3
输出:false
提示:

-2^31 <= n <= 2^31 - 1

题解

法一:循环

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if (n < 1)
            return false;
        while(n)
        {
            if (n % 2 == 1 && n != 1)
                return false;
            else
                n /= 2;
        }
        return true;
    }
};

时间复杂度:O(log n)
空间复杂度:O(1)

在这里插入图片描述
代码二

class Solution {
public:
    bool isPowerOfTwo(int n) {
        long num = 1;//long 防止 n > 2 ^ 30 时 num 溢出
        while(n >= num)
        {
            if (n == num)
                return true;
            num <<= 1;
        }
        return false;
    }
};

时间复杂度:O(log n)
空间复杂度:O(1)
在这里插入图片描述

法二:lowbit

思路:整数n中只有一个二进制位1,从法二开始,接下俩都是围绕这个特殊点出发的

代码一:

class Solution {
public:
    int lowbit(int n )
    {
        return n & (-n);
    }
    bool isPowerOfTwo(int n) {
        if (n < 1)
            return false;
        if (lowbit(n) == n)
            return true;
        return false;
    }
};

时间复杂度:O(1)
空间复杂度:O(1)
在这里插入图片描述
代码二

class Solution {
public:
    int lowbit(int n )
    {
        return n & (-n);
    }
    bool isPowerOfTwo(int n) {
        return n > 0 && (n - lowbit(n) == 0);
    }
};

时间复杂度:O(1)
空间复杂度:O(1)
在这里插入图片描述

法三:内置位技术函数

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n >= 1 && __builtin_popcount(n) == 1;
    }
};

时间复杂度:O(1)
空间复杂度:O(1)
在这里插入图片描述

法四:二进制位表示
代码一:

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n >= 1 && (n & -n) == n;
    }
};

时间复杂度:O(1)
空间复杂度:O(1)
在这里插入图片描述

代码二:

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n >= 1 && (n & (n - 1)) == 0;
    }
};

时间复杂度:O(1)
空间复杂度:O(1)
在这里插入图片描述
法五:异或

//实质就是n ^ (n - 1) == 2 * n - 1
//例如 3 --- 11 ^ 10 = 01 != 2 * 3 - 1舍去
//4 --- 100 ^ 011 = 111 == 2 * 4 - 1
//只不过得考虑溢出
class Solution {
public:
    bool isPowerOfTwo(int n) {
        return (n >= 1 && n <= 1073741824) && ((n ^ (n - 1)) ==n - 1 + n);
    }
};

时间复杂度:O(1)
空间复杂度:O(1)
在这里插入图片描述
法六:判断是否为最大 2 的幂的约数

思路:根据题目中给我们的n 的范围我们知道的最大值为BIG =  2 ^ 30
只要BIG % n == 0就满足条件

constexpr与const的区别

class Solution {
    private:
    static constexpr int BIG = 1 << 30;
public:
    bool isPowerOfTwo(int n) {
        return n >= 1 && (BIG % n == 0);
    }
};

时间复杂度:O(1)
空间复杂度:O(1)
在这里插入图片描述

以上是关于《LeetCode之每日一题》:45.2 的幂的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:158.3的幂

《LeetCode之每日一题》:194.重新排序得到 2 的幂

Leecode 869. 重新排序得到 2 的幂——Leecode每日一题系列

LeetCode算法,每日一题,冲击阿里巴巴,day6

《LeetCode之每日一题》:85.杨辉三角 II

《LeetCode之每日一题》:174.排列硬币