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

这篇博客介绍了多种方法判断一个整数是否为2的幂次方,包括循环、位运算等高效算法,并给出了每种方法的时间和空间复杂度。通过对整数的二进制表示进行操作,可以快速确定其是否为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)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值