分治法
分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
这个技巧是很多高效算法的基础,如排序算法(快速排序、归并排序)、傅里叶变换(快速傅里叶变换)。
二分幂
对于一个数,比如a的n次方,如果涉及到的范围比较小的话,大家都会采用for循环一个一个乘。但是当数据范围非常大的时候,普通暴力的方法时间复杂度为O(N),肯定会超时。而二分幂的原理实际上跟二分查找、归并排序是相似的,都是运用的分治思想。
例如:
要求a的n次方,如果n为偶数,我们只需要求出a的n/2次方,再平方一次即可;
如果n为奇数,我们只需要求出a的(n-1)/2次方,平方一次,再乘以a即可。
这样,每递归一次,时间几乎就降了一半,总的时间复杂度就降到了O(Lgn),所以说采用分治思想的二分幂,时间效率还是很高的。
参考代码
下面附各种代码
有递归的
long long int pow(int a,int n)
{
if (n==0)
return 1;
if (n==1)
return a;
long long int ans=pow(a,n/2);
ans*=ans;
if (n%2==1)
ans*=a;
return ans;
}
用类写的
class Solution {
public:
double fun(double x, int n)
{
if(n == 0)
return 1;
double half;
if(n&1)
{
half = fun(x, n/2);
return x*half*half;
}
else
{
double half = fun(x, n/2);
return half * half;
}
}
double pow(double x, int n) {
double result = fun(x, n);
if(n < 0)
result = 1/result;
return result;
}
};
位运算版本
int pow(int a, int n) {
int res = 1;
while (n) {
if (n & 1)
res *= a;
a *= a;
n >>= 1;
}
return res;
}
以上网上搜集来代码,如有侵权,请联系我删除。