当前位置: 首页 > article >正文

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

Problem: 231. 2 的幂

文章目录

  • 题目描述
  • 思路即解法
  • 复杂度
  • Code

题目描述

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

思路即解法

思路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;
    }
};


http://www.kler.cn/news/233535.html

相关文章:

  • H5/CSS 笔试面试考题(61-70)
  • TCP 传输控制协议——详细
  • Java强训day16(选择题编程题)
  • 【项目问题解决】java. net.SocketException: Connection reset
  • python命令行参数Argparse
  • Django(十)
  • rtt设备io框架面向对象学习-框架
  • 探索C语言的内存魔法:动态内存管理解析
  • 6 scala-面向对象编程基础
  • [word] word2019段落中创建纵横混排的方法图解教程 #知识分享#其他#职场发展
  • google scholar引用出现问题
  • 上位机图像处理和嵌入式模块部署(利用python开发软件)
  • PYTHON 120道题目详解(73-75)
  • MySQL数据库语句总结
  • jvm问题自查思路
  • 【开源】SpringBoot框架开发超市账单管理系统 JAVA+Vue+SpringBoot+MySQL
  • ideaIU-2023.2.1安装教程
  • 【ROS机器人系统】实验 2 熟悉和使用 URDF 创建机器人模型
  • 分享76个表单按钮JS特效,总有一款适合您
  • 07 A B 从计数器到可控线性序列机
  • 13 OpenGL顶点后处理
  • DataX详解和架构介绍
  • JavaWeb- 转发(Forward)和重定向(Redirect)
  • [韩顺平]python笔记
  • Linux系统基础 03 IP地址虚拟网络、Linux软件包管理、ssh服务、apache服务和samba服务的简单搭建
  • 构建高效Docker环境:网络配置全指南
  • 《CSS 简易速速上手小册》第3章:CSS 响应式设计(2024 最新版)
  • 企业飞书应用机器人,使用python自动发送文字内容到群消息
  • Linux增删ip
  • docker-compose部署gitlab和jenkins