首页 > 其他分享 >剑指 Offer 16. 数值的整数次方

剑指 Offer 16. 数值的整数次方

时间:2023-04-07 20:13:12浏览次数:61  
标签:return Offer double 复杂度 16 long quickmul res 次方

题解链接:剑指 Offer 16. 数值的整数次方

方法一:迭代实现快速幂

解题思路

通过迭代的方法,自下向上实现快速幂求解过程,初始化结果 \(res = 1\),底数 \(t = x\) ,幂次为 \(n\)。当 \(n\) 为奇数时,\(res = res * t\),先乘上一个 \(t\),此时还有 \(n-1\) 个 \(t\) 相乘,即相当于计算 \((t * t) ^ {(n - 1) / 2}\),将问题规模减半,依次循环下去。

代码

class Solution {
public:
    double quickmul(double x, long long N) {
        double res = 1.0, t = x;
        while (N > 0) {
            if (N & 1) res *= t; // N 为奇数时
            t *= t;
            N >>= 1;
        }
        return res;
    }
    double myPow(double x, int n) {
        long long N = n;
        return N >= 0 ? quickmul(x, N) : 1.0 / quickmul(x, -N);  
    }
};

复杂度分析

时间复杂度:每次底数\(×2\),即幂次减半(除去幂次为奇数时),最终循环 \(log n\)次,故时间复杂度为 \(O(log n)\);
空间复杂度:\(O(1)\)。

方法二:递归实现快速幂

解题思路

通过递归方法,自上向下实现快速幂求解过程。当 \(n\) 为奇数时,返回 \(x * x ^ {n - 1}\);当 \(n\) 为偶数时,返回\(x ^ {n / 2} * x ^ {n / 2}\);递归边界为 \(n == 0\) 时,返回 \(1\)。

代码

class Solution {
public:
    double quickmul(double x, long long N) {
        if (N == 0) return 1;
        if (N & 1) return x * quickmul(x, N - 1);
        else {
            double y = quickmul(x, N / 2);
            return y * y;
        }
    }
    double myPow(double x, int n) {
        long long N = n;
        return N >= 0 ? quickmul(x, N) : 1.0 / quickmul(x, -N);  
    }
};

复杂度分析

时间复杂度:\(O(log n)\);
空间复杂度:\(O(log n)\)。

标签:return,Offer,double,复杂度,16,long,quickmul,res,次方
From: https://www.cnblogs.com/lxycoding/p/17297211.html

相关文章

  • 1604. 警告一小时内使用相同员工卡大于等于三次的人
    题目链接:1604.警告一小时内使用相同员工卡大于等于三次的人方法:模拟解题思路先对数据进行处理,根据\(name\)将其时间存储在哈希表中,对哈兮表进行遍历,每个\(name\)对应一个时间序列,首先对时间序列进行从小到大排序,从\(i=2\)开始遍历该序列,若存在\(list[i-2]+60>=......
  • 剑指 Offer 15. 二进制中1的个数
    题目链接:剑指Offer15.二进制中1的个数方法一:位运算解题思路x=n&-n,\(x\)表示\(n\)的最后一位\(1\)所对应的值,每减去一次\(x\),相当于有一个\(1\),\(res++\)。代码classSolution{public:inthammingWeight(uint32_tn){intres=0;w......
  • acwing2816. 判断子序列
    linkcode#include<bits/stdc++.h>usingnamespacestd;constintN=100010;inta[N],b[N];intmain(){ intn,m; cin>>n>>m; for(inti=1;i<=n;i++)cin>>a[i]; for(inti=1;i<=m;i++)cin>>b[i]; in......
  • 用 Go 剑指 Offer 29. 顺时针打印矩阵
    给你一个m行n列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例1:  输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:  输入:matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7] 提示:m......
  • 一个人的职业生涯之旅 —— 应届生求职、面试、Offer、跳槽(发展瓶颈、薪资倒挂、职业
    一、应届生求职问题1、求职平台1、Boss直聘2、前程无忧3、拉勾网4、应届生求职网站_最新更新校园招聘/实习机会/内推资讯_牛客网_牛客网_牛客网2、简历怎么写2.1、简历照片1、要与本人形象相符,不要看上去有较大差别,使用最近半年内的免冠照片,选择能够显示自己气质佳的照片,但......
  • 用 Go 剑指 Offer 17. 打印从1到最大的n位数
    输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。示例1:输入:n=1输出:[1,2,3,4,5,6,7,8,9] 说明:用返回一个整数列表来代替打印n为正整数通过次数251,223提交次数323,027来源:力扣(LeetCode)链接:https://leetcod......
  • 整数的划分 NC16695
    原题链接思路本题目数据量较弱,所以可以考虑直接用dfs代码#include<iostream>usingnamespacestd;intans;voiddfs(intn,intd,intk){if(k==0){if(n==0)ans++;return;}for(inti=d;i<=n;i++)dfs(n-i,......
  • Headshot UVA - 1636
     #include<iostream>#include<vector>#include<cstring>#include<algorithm>usingnamespacestd;constintN=104;strings;voidsov(){ inti; intlen=s.size();s+=s; inta=0,b=0; for(i=0;i<=len;i++){ if(......
  • 用 Go 剑指 Offer 11. 旋转数组的最小数字
    已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,4,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,4]若旋转7次,则可以得到[0,1,4,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次的结果为数......
  • docker dev Environment+node16+vscode联合开发
    笔记软件在2023/4/713:33:47推送该笔记1.DockerFileFROMcentos:7.6.1810RUNmkdir-p/data/nodeWORKDIR/data/node#RUNcurlhttps://nodejs.org/dist/v16.20.0/node-v16.20.0-linux-x64.tar.gz>node-v16.20.0-linux-x64.tar.gzCOPY/env/node-v16.20.0-linux-x64.......