`
bcyy
  • 浏览: 1823602 次
文章分类
社区版块
存档分类
最新评论

Pow(x, n) -- LeetCode

 
阅读更多
原题链接:http://oj.leetcode.com/problems/powx-n/
这道题是一道数值计算的题目,因为指数是可以使结果变大的运算,所以要注意越界的问题。如同我在Sqrt(x)这道题中提到的,一般来说数值计算的题目可以用两种方法来解,一种是以2为基进行位处理的方法,另一种是用二分法。这道题这两种方法都可以解,下面我们分别介绍。

第一种方法在Divide Two Integers使用过,就是把n看成是以2为基的位构成的,因此每一位是对应x的一个幂数,然后迭代直到n到最高位。比如说第一位对应x,第二位对应x*x,第三位对应x^4,...,第k位对应x^(2^(k-1)),可以看出后面一位对应的数等于前面一位对应数的平方,所以可以进行迭代。因为迭代次数等于n的位数,所以算法的时间复杂度是O(logn)。代码如下:

public double pow(double x, int n) {
  if(n==0)
    return 1.0;
  double res = 1.0; 
  if(n<0)
  {
    if(x>=1.0/Double.MAX_VALUE||x<=1.0/Double.MIN_VALUE)
      x = 1.0/x;
    else
      return Double.MAX_VALUE;
    if(n==Integer.MIN_VALUE)
    {
      res *= x;
      n++;
    }
  }
  n = Math.abs(n);
  boolean isNeg = false;
  if(n%2==1 && x<0)
  {
    isNeg = true;
  }
  x = Math.abs(x);
  while(n>0)
  {
    if((n&1) == 1)
    {
      if(res>Double.MAX_VALUE/x)
        return Double.MAX_VALUE;
      res *= x;
    }
    x *= x;
    n = n>>1;
  }
  return isNeg?-res:res;
}
以上代码中处理了很多边界情况,这也是数值计算题目比较麻烦的地方。比如一开始为了能够求倒数,我们得判断倒数是否越界,后面在求指数的过程中我们也得检查有没有越界。所以一般来说求的时候都先转换为正数,这样可以避免需要双向判断(就是根据符号做两种判断)。
接下来我们介绍二分法的解法,如同我们在Sqrt(x)的方法。不过这道题用递归来解比较容易理解,把x的n次方划分成两个x的n/2次方相乘,然后递归求解子问题,结束条件是n为0返回1。因为是对n进行二分,算法复杂度和上面方法一样,也是O(logn)。代码如下:
double pow(double x, int n) {
    if (n == 0) return 1.0;
    double half = pow(x, n/2);
    if (n%2 == 0)
    {
        return half*half;
    }
    else if (n>0)
    {
        return half*half*x;
    }
    else
    {
        return half/x*half;
    }
}
以上代码比较简洁,不过这里有个问题是没有做越界的判断,因为这里没有统一符号,所以越界判断分的情况比较多,不过具体也就是在做乘除法之前判断这些值会不会越界,有兴趣的朋友可以自己填充上哈,这里就不写太啰嗦的代码了。不过实际应用中健壮性还是比较重要的,而且递归毕竟会占用递归栈的空间,所以我可能更推荐第一种解法。

分享到:
评论

相关推荐

    三角形最小路径和LeetCode-Leetcode-July-Challenge-2020:包含Leetcode2020年七月挑战赛问题的解决

    Leetcode-June-Challenge-2020 它包含 2020 年 Leetcode 七月挑战赛的解决方案 比赛链接: 问题 问题名称 点击打开问题 排列硬币 二叉树层次遍历二 N天后的牢房 丑二 汉明距离 加一 岛周长 3总和 二叉树的最大宽度 ...

    leetcode638python-leetcode-solutions:leetcode-解决方案

    pow(x,n) 简单的 7号 反向整数 简单的 6号 之字形反转 简单的 2号 添加两个数字 简单的 3号 无重复字符的最长子串 中等的 4号 两个有序数组的中位数 难的 2016 年 11 月 17 日更新 数字 问题 等级 最长回文子串 中等...

    猜单词leetcode-leetcode:我的leetcode

    猜单词leetcode 通过 leetcode 学习数据结构与算法 数据结构 data structure 数组(栈 队列) 链表 ...50.pow-x-n.js 69.x-的平方根.js 278.第一个错误的版本.js 374.猜数字大小.py 递归 recursion +

    leetcode卡-July-Challenge-Leetcode:七月-挑战-Leetcode

    天:Pow(x,n) () 第17天:前K个频繁元素() 第 18 天:课程表 II () 第 19 天:添加二进制 () 第 20 天:删除链表元素 () 第 21 天:单词搜索 () 第22天:二叉树之字形水平顺序遍历() 第 23 天:单数 III () 第 ...

    Pow(xn)leetcode-Binary-Search-3:Binary-Search-3

    Pow(xn) leetcode Binary-Search-3 问题1 Pow(x,n) () 问题2 找到 K 个最近的元素 ()

    leetcode530-leetcode-practice:练习力码

    leetcode 530 力码练习 前 250 个问题 1 二和 :check_mark: 3 无重复字符的最长子串 ...Pow(x, n) 51 N-Queens 52 N-Queens II 53 最大子阵 54 螺旋矩阵 55 跳跃游戏 56 合并间隔 57 插入间隔 59 螺旋矩阵II 6

    股票买卖最佳时机leetcode-Leetcode-Lintcode-Python:用Python解决leetcode&lintcode问题

    股票买卖最佳时机leetcode 大批 (53) 最大子阵列 (54) 螺旋矩阵 (57) 插入间隔 (73) ...Pow(x, n) (69) 平方(x) (153) 在旋转排序数组中找到最小值 (154) 在旋转排序数组中求最小值 II (162) 寻找峰

    删除无效括号leetcodeJava-ZY-LeetCode:zy的leetcode解决方案

    删除无效括号 leetcode ...Pow(x, n) M 2018-6-7 北京 Y 无重复字符的最长子串 M 2018-6-10 北京 Y 删除排序数组中的重复项 E 2018-6-13 北京 Y 字符串转整数 M 2018-6-15 北京 Y 有效的括号 E 2018-

    leetcode中国-LeetcodeSolution:LeetCode题目-Java解法(持续更新)

    leetcode中国 LeetcodeSolution leetcode题目解法(持续更新) ...Pow(x, n) divide and conquer 51 N皇后 backtracking 52 N皇后 II backtracking 54 螺旋矩阵 array 62 不同路径 dynamic program

    leetcode2sumc-leetcode-practice:leetcode练习注意事项

    Pow(x, n) 中等的 51 N皇后区 难的 56 合并间隔 中等的 64 最小路径和 中等的 69 平方(x) 简单的 73 设置矩阵零 中等的 74 搜索二维矩阵 中等的 77 组合 中等的 78 子集 中等的 83 从排序列表中删除重复项 简单的 ...

    扔鸡蛋leetcode-Leetcode:力码

    编写程序计算pow(x, y) 50. pow(x, n) 5.7 计算 x^y 2. 给定一个指向单向链表中要删除的节点的指针,如何删除它? 237. 删除链表中的节点 2.3 删除中间节点 3.从第一个字符串中删除出现在第二个字符串中的字符 4. ...

    LeetCode最全代码

    15 | [3 Sum](https://leetcode.com/problems/3sum/) | [C++](./C++/3sum.cpp) [Python](./Python/3sum.py) | _O(n^2)_ | _O(1)_ | Medium || Two Pointers 16 | [3 Sum Closest]...

    leetcode530-LeetCode:力码

    Pow(x, n) 51-60 N-皇后 N-Queens II 最大子阵列 螺旋矩阵 跳跃游戏 合并间隔 插入间隔 螺旋矩阵 II 排列顺序(无法访问文章) 61-70 轮换名单 独特的路径 独特的路径 II 最小路径和(无法访问文章) 有效号码 加一

    leetcode分类-LeetCode:LeetCode在线裁判C++

    Pow(x,n) 优化 Permutations (交换 取子集两种方式) Trie树 11 中序遍历 无堆栈 (前序 后序) 12 map边删除 边输出 不太建议这么用。。。 以及其他基本用法 iterate 红黑树 13.set 16.unordered_map 与 map 17.最大...

    leetcode答案-LeetcodeTopAnswer:https://leetcode-cn.top的回答

    50.pow-x-n 题目: 答案: 69.x-的平方根 题目: 答案: 70.爬楼梯 题目: 答案: 94.二叉树的中序遍历 题目: 答案: 101.对称二叉树 题目: 答案: 141.环形链表 题目: 答案: 206.反转链表 题目: 答案: 剑指...

    leetcode-problem:leetcode中问题的解决方案

    50-powx-n.md 6字形转换.md 7-反向整数.md 9回文数101-150(数量:30) 第101章 第102章 103二叉树之字形水平遍历.md 二叉树最大深度104.md 105从预购和有序遍历构建二叉树.md 106从顺序和后顺序

    leetcode中国-LeetCode:力扣合集

    pow(x, n) 34. 查找有序数组中元素的首尾位置 1-是 35. 搜索插入位置 1-是 658. 找出 K 个最近的元素 1-否 33. 在旋转排序数组中搜索 1-否 81. 在旋转排序数组中搜索 II 1-否 153. 在旋转排序数组中求最小值 154. 在...

    leetcode-python:这是我的python的leetcode解决方案

    在旋转排序数组中搜索140.Fast Power 428.Pow(x,n) 845.最大公约数39.恢复旋转排序数组8,旋转字符串 两个指针56.两次相加415.有效回文891.有效回文II 521.删除重复的号码604.窗口总和610.TwoSum-差等于目标228....

    lrucacheleetcode-Leetcode-Questions:面试编码问题

    Pow(x, n) 最长公共子序列 第一个唯一编号 合并间隔 独特的路径 加一 二叉树最大路径和 检查字符串是否是二叉树中从根到叶路径的有效序列 排序颜色 最小窗口子串 第一个坏版本 子集 克隆图 直方图中最大的矩形 Base ...

    lrucacheleetcode-leetcode-rs:Leetcode算法问题的Rust解决方案

    Pow(x, n)中 53最大子阵列简单 55 Jump Game Medium 56合并间隔中等 57插入间隔硬 60排列序列介质 61轮播列表中 62条独特的路径中 64最小路径和中 66加一轻松 67添加二进制简单 70爬楼梯容易 72编辑距离困难 74搜索...

Global site tag (gtag.js) - Google Analytics