转化为 2 的幂求解

简介: 转化为 2 的幂求解

网络异常,图片无法展示
|

题目描述



这是 LeetCode 上的 342. 4的幂 ,难度为 简单


Tag : 「数学」、「位运算」


给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。


整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4^x4x


示例 1:


输入:n = 16
输出:true
复制代码


示例 2:


输入:n = 5
输出:false
复制代码


示例 3:


输入:n = 1
输出:true
复制代码


提示:


  • -2^{31}231 <= n <= 2^{31}231 - 1


进阶:


你能不使用循环或者递归来完成本题吗?


基本分析



一个数 nn 如果是 44 的幂,等价于 nn 为质因数只有 22 的平方数。


因此我们可以将问题其转换:判断 \sqrt{n}n 是否为 22 的幂。


判断某个数是否为 22 的幂的分析在(题解)231. 2 的幂 这里。


sqrt + lowbit



我们可以先对 nn 执行 sqrt 函数,然后应用 lowbit 函数快速判断 \sqrt{n}n 是否为 22 的幂。


代码:


class Solution {
    public boolean isPowerOfFour(int n) {
        if (n <= 0) return false;
        int x = (int)Math.sqrt(n);
        return x * x == n && (x & -x) == x;
    }
}
复制代码


class Solution {
    public boolean isPowerOfFour(int n) {
        if (n <= 0) return false;
        int x = getVal(n);
        return x * x == n && (x & -x) == x;
    }
    int getVal(int n) {
        long l = 0, r = n;
        while (l < r) {
            long mid = l + r >> 1;
            if (mid * mid >= n) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        return (int)r;
    } 
}
复制代码


  • 时间复杂度:复杂度取决于内置函数 sqrt。一个简单的 sqrt 的实现接近于 P2 的代码。复杂度为 O(\log{n})O(logn)
  • 空间复杂度:O(1)O(1)


最后



这是我们「刷穿 LeetCode」系列文章的第 No.342 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。


在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

相关文章
|
6月前
|
机器学习/深度学习 算法 Serverless
利用无穷级数逼近计算幂运算与开根号——Python实现
使用泰勒级数逼近法,本文介绍了如何用Python计算特殊幂运算,包括分数次幂和开根号。通过定义辅助函数,如`exp`、`getN_minus_n`、`multi`和`getnum`,实现了计算任意实数次幂的功能。实验结果显示,算法能有效计算不同情况下的幂运算,例如`0.09^2`、`1^2`、`0.25^2`、`0.09^(0.5)`、`1^(0.5)`和`0.25^(0.5)`。虽然精度可能有限,但可通过调整迭代次数平衡精度与计算速度。
|
7月前
|
算法 测试技术 C++
【分解质因数 差分数组】2584. 分割数组使乘积互质
【分解质因数 差分数组】2584. 分割数组使乘积互质
【分解质因数 差分数组】2584. 分割数组使乘积互质
|
7月前
|
算法 测试技术 C++
【动态规划】【数学】【C++算法】805 数组的均值分割
【动态规划】【数学】【C++算法】805 数组的均值分割
|
C++
C++ 超大整数相加、相乘的精确求解,以及10000的阶乘
C++ 超大整数相加、相乘的精确求解,以及10000的阶乘
123 0
|
存储
[递推]双幂序列、多幂序列、双幂积序列的和
[递推]双幂序列、多幂序列、双幂积序列的和
212 0
[递推]双幂序列、多幂序列、双幂积序列的和
leetcode-829. 连续整数求和(数论)
这题求连续正整数,刚好满足等差数列,可以用等差数列求和公式 n = (i + (i + k)) * (k + 1) / 2 其中i是连续正整数的首项,k是尾项和首项的差值
118 0
leetcode-829. 连续整数求和(数论)
【分治法】整数因子分解问题
【分治法】整数因子分解问题
351 0
【分治法】整数因子分解问题
【MATLAB】数值运算 ( 数值运算示例 | 三角函数 | 指数运算 | 对数运算 | 常用的数学公式对应函数 )
【MATLAB】数值运算 ( 数值运算示例 | 三角函数 | 指数运算 | 对数运算 | 常用的数学公式对应函数 )
247 0
【MATLAB】数值运算 ( 数值运算示例 | 三角函数 | 指数运算 | 对数运算 | 常用的数学公式对应函数 )