【LeetCode】面试题16. 数值的整数次方

时间:2020-05-26
本文章向大家介绍【LeetCode】面试题16. 数值的整数次方,主要包括【LeetCode】面试题16. 数值的整数次方使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目:

思路:

1、最简单直观的方法就是循环相乘,但是会超时

2、快速幂(二进制角度)
对于任意十进制n,设其二进制为\(b_m\)...\(b_2b_1\),则有

  • \(n=1b_1 + 2b_2 + ... + 2^{m-1}b_m\)
  • \(x^n = x^{1b_1 + 2b_2 + ... + 2^{m-1}b_m} = x^{1b_1}x^{2b_2}...x^{2^{m-1}b_m}\)

根据上面的推导,可以把\(x^n\)的计算,转化为

  • 计算\(x^1, x^2, ..., x^{2^{m-1}}\)的值,循环赋值即可\(x=x^2\)
  • 获取二进制各位\(b_1, b_2, ..., b_m\)的值,循环执行与操作、移位操作即可

3、快速幂(递归二分)

4、快速幂(非递归二分)
非递归形式同二进制形式原理相同,以\(x^{77}=x\cdot x^4 \cdot x^8 \cdot x^{64}\)为例,x一直在累积平方,遇到奇数则将当前的x乘到结果上。

\( \begin{aligned} x^{77} =&\ (x^2)^{38}\ \ \ \ * \ \ \ \ x \ \ \ \ \ \ \ \ 1 \\ (x^2)^{38} =&\ (x^4)^{19}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 \\ (x^4)^{19} =&\ (x^8)^9\ \ \ \ \ * \ \ \ \ x^4 \ \ \ \ \ \ \ 0 \\ (x^8)^9 =&\ (x^{16})^4\ \ \ \ * \ \ \ \ x^8 \ \ \ \ \ \ 1 \\ (x^{16})^4 =&\ (x^{32})^2\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 \\ (x^{32})^2 =&\ (x^{64})^1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 \\ (x^{64})^1 =&\ (x^{128})^0\ \ \ * \ \ \ \ x^{64}\ \ \ \ 1 \end{aligned} \)

代码:

Python

class Solution(object):
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        # 暴力循环求解 291/304 超时
        # t = abs(n)
        # result = 1.0
        # while t:
        #     result *= x
        #     t -= 1
        # if n < 0:
        #     return 1.0 / result
        # else:
        #     return result

        # # 快速幂(二进制)
        # t = abs(n)
        # result = 1.0
        # while t:
        #     if t & 1:
        #         result *= x
        #     x *= x
        #     t >>= 1
        # if n < 0:
        #     return 1.0 / result
        # else:
        #     return result

        # # 快速幂(递归二分)
        # if n == 0:
        #     return 1.0
        # if n < 0:
        #     return 1.0 / self.myPow(x, -n)
        # if n & 1:
        #     return x * self.myPow(x, n-1)
        # return self.myPow(x * x, n // 2)

        # 快速幂(非递归二分, 同二进制思想一致)
        result = 1.0
        t = abs(n)
        while t:
            if t % 2:
                result *= x
            x *= x
            t //= 2
        if n < 0:
            return 1.0 / result
        else:
            return result

相关问题

原文地址:https://www.cnblogs.com/cling-cling/p/12966453.html