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

剑指 Offer(第2版)面试题 16:数值的整数次方

剑指 Offer(第2版)面试题 16:数值的整数次方

  • 剑指 Offer(第2版)面试题 16:数值的整数次方
    • 解法1:快速幂 - 递归写法
    • 解法2:快速幂 - 非递归写法

剑指 Offer(第2版)面试题 16:数值的整数次方

题目来源:27. 数值的整数次方

不得使用库函数,同时不需要考虑大数问题。

只要输出结果与答案的绝对误差不超过 10−2 即视为正确。

注意:

  • 不会出现底数和指数同为 0 的情况
  • 当底数为0时,指数一定为正
  • 底数的绝对值不超过 10,指数的绝对值不超过 109

解法1:快速幂 - 递归写法

最朴素的想法就是循环,一个一个往上乘,不过这会超时。

需要注意的是指数为负数的情况,只需要把指数取绝对值,最后结果取倒数即可。

注意指数 exponent 要转换成 unsigned int 或者 long long,有一个数据是 10, −2147483648,int 的范围是 −2147483648 ~ 2147483647,对 −2147483648 取绝对值会爆掉,转成 signed int 也会爆。

算法:

在这里插入图片描述

代码:

class Solution
{
public:
    double Power(double base, int exponent)
    {
        if (base == 0)
            return 0.0;
        if (exponent >= 0)
            return quickMul(base, (long long)exponent);
        else
            return quickMul(1.0 / base, abs((long long)exponent));
    }
    // 辅函数 - 快速幂
    double quickMul(double base, long long exponent)
    {
        if (exponent == 0)
            return 1.0;
        double y = quickMul(base, exponent / 2);
        if (exponent % 2 == 1)
            return y * y * base;
        else
            return y * y;
    }
};

复杂度分析:

时间复杂度:O(log(exponent))。

空间复杂度:O(log(exponent))。

解法2:快速幂 - 非递归写法

在这里插入图片描述

详见 Pow(x, n) - LeetCode官方题解。

代码:

class Solution
{
public:
    double Power(double base, int exponent)
    {
        unsigned int n = abs(exponent);
        double res = 1.0;
        while (n)
        {
            if (n & 01)
                res *= base;
            base *= base;
            n >>= 1;
        }
        if (exponent < 0)
            res = 1.0 / res;
        return res;
    }
};

复杂度分析:

时间复杂度:O(log(exponent))。

空间复杂度:O(1)。


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

相关文章:

  • JAVA-作业7-画一个笑脸
  • 【算法】算法题-20231205
  • 【C++】树型结构关联式容器:map/multimap/set/multisetの使用指南(27)
  • canvas绘制小丑
  • Mysql、Oracle区分大小写?
  • 【新手解答8】深入探索 C 语言:递归与循环的应用
  • spring cloud nacos整合gateway
  • 十五、机器学习进阶知识:K-Means聚类算法
  • 【SQL SERVER】定时任务
  • 【ARM Trace32(劳特巴赫) 使用介绍 12 -- Trace32 常用命令之 d.dump | data.dump 介绍】
  • Linux: 文档 :相关接口文档手册还是需要仔细阅读
  • mfc 设置excel 单元格的列宽
  • EM32DX-C4【C#】
  • 解决:ERROR: No matching distribution found for rarfile
  • 传输层可靠传输的原理
  • 【网络安全技术】密钥管理
  • llama.cpp部署(windows)
  • LinuxBasicsForHackers笔记 --添加和删​​除软件
  • Notepad++ 安装TextFx插件失败
  • 双目光波导AR眼镜_AR智能眼镜主板PCB定制开发
  • 探讨Unity中的动画融合技术(BlendTree)
  • <Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(5)》(21)
  • C#的方法使用
  • C++数据结构:B树
  • C10练习题
  • 分享几个电视颜色测试图形卡
  • JVM类加载全过程
  • 2023-2024-1-高级语言程序设计-第2次月考函数题
  • 【C语言】预处理详解
  • js获取当前时间,当日零点,前一周时间