• 【每日一题】50. Pow(x, n)


    50. Pow(x, n) - 力扣(LeetCode)

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

    示例 1:

    输入:x = 2.00000, n = 10
    输出:1024.00000
    

    示例 2:

    输入:x = 2.10000, n = 3
    输出:9.26100
    

    示例 3:

    输入:x = 2.00000, n = -2
    输出:0.25000
    解释:2-2 = 1/22 = 1/4 = 0.25
    

    提示:

    • -100.0 < x < 100.0
    • -231 <= n <= 231-1
    • n 是一个整数
    • 要么 x 不为零,要么 n > 0 。
    • -104 <= xn <= 104
    1. class Solution {
    2. public double myPow(double x, int n) {
    3. if(n == 0) return 1;
    4. if(x == 1) return 1;
    5. long ln = n;
    6. if(ln < 0) {
    7. ln = -ln ;
    8. x = 1.0/x;
    9. }
    10. long tmp = ln ;
    11. ArrayList arr = new ArrayList();
    12. while(tmp > 1) {
    13. if(tmp%2 == 1) {
    14. tmp/=2;
    15. arr.add(tmp);
    16. } else {
    17. tmp/=2;
    18. }
    19. }
    20. long flag = 1;
    21. double y = x;
    22. while(flag < ln) {
    23. x*=x;
    24. System.out.println(flag);
    25. if(arr.contains(flag)) {
    26. x*=y;
    27. flag*=2;
    28. flag += 1;
    29. } else {
    30. flag *= 2;
    31. }
    32. }
    33. return x;
    34. }
    35. }

            今天这道题是一道中等题。

            题目很简单,实现x的n次幂。看完题目,其实最简单的方法就是直接模拟,一个循环一个个乘过去就可以了。但是看看n的数量,2的31次方-1,基本上O(n)的方法是没有办法通过的。应该去寻找更快的方法。这题实际上可以使用二分快速幂!!!

            实际上我们可以观察每一个数,例如10。 每次除2的话,会得到什么?5,2,1。每次二分的话,就可以得到lO(logn)的时间复杂度。但,奇数怎么办?就像10二分完会得到一个5,5实际上是没办法再由一个数来获得的,然而5可以由4+1。从结果10倒推回1的话,可以发现,10次方可以由5次方平方。5次方,可以由2次方平方再*1次方。平方就直接平方就可以了。所以,难点其实只在于什么时候要对前一个数平方完之后要不要乘一个一次方,让其可以得到目标数。

            由于我们是倒着推回去的,最重要的问题是要怎么记录什么时候要相加。如果直接由n/2回去,实际上需要乘一次方的位置不是现在的位置,因为那是在奇数/2次方的时候才要做的事。那倒着推回去,会想到递归!!!让其一直压栈,保存状态,直到从1开始处理。但递归比较难理解,感兴趣的小伙伴可以去看看题解。

            博主这里使用的是记录。其实不一定要递归,只需要记住到底什么时候需要乘一次方就行了。那就用一个数组记录。如果直接创建数组,n的规模太大,最后会出现超出内存限制的错误。

    实际上也没必要开那么大的数组,只需要使用arrlist,记录关键位置,之后用一个数,从1开始乘2,看看这个数是否在arrlist里,如果在arrlist里,那么就说明平方完要再乘一次方。如果不再,平方完即可。当然,不要忘记如果在arrlist里,那么这个用来循环的数也要+1,这样才能平衡。至于边界控制,大家可以自己决定。

            

     

  • 相关阅读:
    Pycharm 远程连接服务器(ssh)运行深度学习代码 | 详细步骤
    MySQL8.0 高可用集群化 · mysql-shell · mysql-router · docker · 单主多从
    低代码平台协同OA升级,促进金融企业信息化建设
    《单片机原理及应用》-片外拓展
    2023年,学测试还有前途吗?
    Wireshark抓包工具配置以及MQTT抓包分析
    【Linux网络】从原理到实操,感受PXE无人值守自动化高效批量网络安装系统
    虚拟机安装openEuler/MobaXterm工具登录系统
    Kuhlmann库尔曼控制器维修21.49电源电路板维修特点
    情绪的变化需要控制
  • 原文地址:https://blog.csdn.net/C_Ryson/article/details/132792582