力扣231. 2 的幂(数学,二分查找,位运算)

Problem: 231. 2 的幂

题目描述

在这里插入图片描述在这里插入图片描述

思路即解法

思路1:位运算

1.易验证2的幂为正数;
2.易得2的幂用二进制表示只能有一个位为数字1
3.即将其转换为二进制统计其二进制1的个数

思路2:数学

当给定数n大于1时,每次当n模2等于0时(此时是2的幂)每次将n除以2最后判断n是否为1

思路3:二分查找

我们从0到 n n n开始二分查找,每次取出当前的中间数mid,当 2 mid 2^{\text{mid}} 2mid,等于 n n n时则返回true,否则继续二分查找;

复杂度

思路1:
时间复杂度:

O ( 1 ) O(1) O(1)

空间复杂度:

O ( 1 ) O(1) O(1)

思路2:
时间复杂度:

O ( 1 ) O(1) O(1);因为在int范围内2的最大的幂为 2 30 2^{\text{30}} 230

空间复杂度:

O ( 1 ) O(1) O(1)

思路:
时间复杂度:

O ( l o g n ) O(logn) O(logn)

空间复杂度:

O ( 1 ) O(1) O(1)

Code

思路1:

class Solution {
   
public:
    /**
     * Bit operation
     * @param n Given number
     * @return bool
     */
    bool isPowerOfTwo(int n) {
   
        if (n < 0) {
   
            return false;
        }
        int mask = 1;
        int count = 0;
        for (int i = 0; i < 32; ++i) {
   
            if ((n & mask) != 0) {
   
                count++;
            }
            mask <<= 1;
        }
        if (count == 1) {
   
            return true;
        }
        return false;
    }
};

思路2:

class Solution {
   
public:
    /**
     * Math
     * @param n Given number
     * @return bool
     */
    bool isPowerOfTwo(int n) {
   
        if (n < 0) {
   
            return false;
        }
        if (n > 1) {
   
            while (n % 2 == 0) {
   
                n /= 2;
            }
        }
        return n == 1 ? true : false;
    }
};
  

思路3:

class Solution {
   
public:
    /**
     * Binary Search
     * @param n Given number
     * @return bool
     */
    bool isPowerOfTwo(int n) {
   
        if (n < 1) {
   
            return false;
        }
        int start = 0;
        int end = n;
        while (start <= end) {
   
            int mid = start + (end - start) / 2;
            double result = (double)(pow(2, mid));
            if (result == n) {
   
                return true;
            } else if (result > n) {
   
                end = mid - 1;
            } else {
   
                start = mid + 1;
            }
        }
        return false;
    }
};

相关推荐

  1. 数组704二分查找

    2024-02-10 07:48:01       68 阅读
  2. - 704. 二分查找

    2024-02-10 07:48:01       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-10 07:48:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-10 07:48:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-10 07:48:01       87 阅读
  4. Python语言-面向对象

    2024-02-10 07:48:01       96 阅读

热门阅读

  1. django中实现数据迁移

    2024-02-10 07:48:01       43 阅读
  2. web3之跨链合成资产交易协议LINA (Linear)

    2024-02-10 07:48:01       56 阅读
  3. 力扣0124——二叉树的最大路径和

    2024-02-10 07:48:01       51 阅读
  4. 算法刷题day10

    2024-02-10 07:48:01       47 阅读
  5. STL - 容器适配器

    2024-02-10 07:48:01       54 阅读
  6. 数据分类分级

    2024-02-10 07:48:01       45 阅读
  7. (52)只出现一次的数字III

    2024-02-10 07:48:01       59 阅读