• [LeetCode] 50. Pow(x, n)


    传送门:[LeetCode] 50. Pow(x, n)

    题目描述

    实现 pow(x, n) ,即计算 x 的 n 次幂函数。

    说明:

    • -100.0 < x < 100.0
    • n 是 32 位有符号整数,其数值范围是 [(−2^{31}), (2^{31}) − 1] 。

    示例 1:

    输入: 2.00000, 10
    输出: 1024.00000

    示例 2:

    输入: 2.10000, 3
    输出: 9.26100

    **示例 3: **

    输入: 2.00000, -2
    输出: 0.25000
    解释: (2^{-2}) = (1/2^2) = 1/4 = 0.25

    分析与代码

    • 这题直接用循环暴力相乘,肯定谁都能想出来,但这道是中等题,就不会这么简单,暴力法是会超时的。当然,直接循环暴力相乘也要注意幂为负数的时候。
    • 题目分类在二分,很自然就想到了(x^n = (x^{n/2})^2)

    解法一、暴力

    • 注意幂为负数的时候,这里是不管正负数,先算出来,最后在判断正负,负数就取倒数。
    • 也可以先作处理,把 x 赋值为 1/x,把 n 取反,这样就可以直接算。
    • 注意:int 的最小值取反后会超出 int 的表示范围,使用 long。

    代码:

    class Solution {
        public double myPow(double x, int n) {
            double result = 1;
            for (long i = 0; i < Math.abs(n); i++) {
                result *= x;
            }
            return n > 0 ? result : 1 / result;
        }
    }
    

    解法二、快速幂(递归)

    • 当 n 为偶数时,(x^n = (x^{n/2})^2),但当 n 为奇数时,会少乘了一次 x,即应为(x^n = (x^{n/2})^2 * x)
    • 奇怪,不转为 long 好像也能过,测试用例删除了幂为 int 的最小值?

    代码:

    class Solution {
        public double fastPow(double x, long n) {
            if (n == 0) {
                return 1;
            }
            double sqrt = fastPow(x, n / 2);
            if ((n & 1) == 0) {
                return sqrt * sqrt;
            } 
            return sqrt * sqrt * x;
        }
    
        public double myPow(double x, int n) {
            long num = n;
            if (n < 0) {
                x = 1 / x;
                num = -num;
            }
            return fastPow(x, num);
        }
    }
    

    解法三、快速幂(迭代)

    • 思路其实和递归一样,只是递归是拆分的方式,迭代是累积的方式。

    代码:

    class Solution {
        public double myPow(double x, int n) {
            double result = 1;
            double product = x;
            for (int i = n; i != 0; i /= 2) {
                if ((i & 1) != 0) {
                    result *= product;
                }
                product *= product;
            }
            return n > 0 ? result : 1 / result;
        }
    }
    

    小结

    这道题主要考查二分,幂运算的快速幂运算。

    也需要注意 int 的最小值取反后会超出 int 范围的问题,与补码知识相关。



    ┆ 然 ┆   ┆   ┆   ┆ 可 ┆   ┆   ┆ 等 ┆ 暖 ┆
    ┆ 而 ┆ 始 ┆   ┆   ┆ 是 ┆ 将 ┆   ┆ 你 ┆ 一 ┆
    ┆ 你 ┆ 终 ┆ 大 ┆   ┆ 我 ┆ 来 ┆   ┆ 如 ┆ 暖 ┆
    ┆ 没 ┆ 没 ┆ 雁 ┆   ┆ 在 ┆ 也 ┆   ┆ 试 ┆ 这 ┆
    ┆ 有 ┆ 有 ┆ 也 ┆   ┆ 这 ┆ 会 ┆   ┆ 探 ┆ 生 ┆
    ┆ 来 ┆ 来 ┆ 没 ┆   ┆ 里 ┆ 在 ┆   ┆ 般 ┆ 之 ┆
    ┆   ┆   ┆ 有 ┆   ┆   ┆ 这 ┆   ┆ 降 ┆ 凉 ┆
    ┆   ┆   ┆ 来 ┆   ┆   ┆ 里 ┆   ┆ 临 ┆ 薄 ┆
  • 相关阅读:
    -webkit-user-select
    防火墙配置
    apache+tomcat集群部署笔记
    项目管理理念
    用plsql 导入导出oracle表结构数据
    Pair programming
    [整理]Linux压缩与解压缩命令整理。
    [转]虚拟机VMware3种网络模式(桥接、nat、Host-only)的工作原理
    [原创]VM虚拟机安装centos6.4详细图文教程
    [转]z-order引出的问题
  • 原文地址:https://www.cnblogs.com/qiu_jiaqi/p/LeetCode-50.html
Copyright © 2020-2023  润新知