《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就满足条件
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之每日一题》:194.重新排序得到 2 的幂