快速幂 01

141 阅读1分钟

LeetCode 50

leetcode-cn.com/problems/po…

解题思路

普通for循环持续乘上去,时间复杂度是O(n)

可以用分治思想的快速幂来让时间复杂度降到O(logn)

快速幂思路

如图可以通过二分,将幂折半,另一半直接与底数做算数,如果幂是奇数,则还需要补一个底数相乘。

如何实现

快速幂实现

代码如下

递归分治

class Solution {
	public double myPow(double x, int n) {
		if (n < 0) {
			return 1.0 / myPowRecursion(x, -n);
		} else {
			return myPowRecursion(x, n);
		}
	}
	public double myPowRecursion(double x, int n) {
		if (n == 0) {
			return 1.0;
		}
		double half = myPowRecursion(x, n / 2);
		if (n % 2 == 0) {
			return half * half;
		} else {
			return half * half * x;
		}
	}
}

迭代快速幂

class Solution {
	public double myPow(double x, int n) {
		if (x == 0) {
			return 0;
		}
		long N = n; // int[−2147483648,2147483647],n为int_min时会溢出
		double res = 1;
		if (N < 0) {
			x = 1 / x;
			N = -N;
		}
		while (N > 0) {
			if ((N & 1) == 1) {
				res *= x;// 如果是奇数,则结果还需要补一个底数相乘
			}
			x *= x; // 折半后底数取平方数
			N >>= 1; // 幂折半
		}
		return res;
	}

	public static void main(String[] args) {
		Solution k = new Solution();
		System.out.println(k.myPow(2, -2));
	}

}