校招季——编程题目(12-13)

本文介绍两种高效算法技巧:快速求幂算法实现O(logN)时间复杂度,并通过迭代和矩阵运算两种方式快速计算斐波那契数列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

12.       快速求幂(题目047

题目:

给定两个整数baseexp(非负整数),求baseexp次幂,要求O(lgN)的时间复杂度。

解答:

int FastPow(int base, int exp)
{
    if (exp == 0)
        return 1;
    if (exp == 1)
        return base;
    int ret = FastPow(base * 2, exp / 2);
    if (exp % 2 == 1)
        return ret * base;
    else
        return ret;
}

13.       快速斐波那契数列

题目:

输出斐波那契数列的第n项。

解答:

方法1

思路:用迭代方式,只保存当前数列中最后两项的值,避免了重复计算。时间复杂度O(N)

int Fibonacci(int n)
{
    int fib[2] = {0, 1};
    if (n <2)
        return fib[n];
    int i;
    for (i = 1; i < n; ++i)
    {
        int temp = fib[1];
        fib[1] += fib[0];
        fib[0] = temp;
    }
    return fib[1];
}

方法2(快速方法):

思路:将数列的迭代计算转成矩形计算

因此有


再利用快速求幂的方法,将时间复杂度降至O(logn),但常数项较大。

Matrix FastMatrixPow(Matrix m, int exp)
{
    static const Matrix E={{{1, 0}, {0, 1}}};
    if (exp == 0)
        return E;
    if (exp == 1)
        return m;
    Matrix ret = FastMatrixPow(MatrixProduct(m,m), exp / 2);
    if (exp % 2 ==1)
        return MatrixProduct(ret, m); /* 矩阵相乘,返回新的矩阵,代码省略 */
    else
        return ret;
}
int FastFibonacci(int n)
{
    if (n == 0)
        return 0;
    if (n == 1)
        return 1;
    Matrix m = {{{1, 1}, {1, 0}}};
    m = FastMatrixPow(m, n);
    return m.d[1][0];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值