《算法零基础100讲》(第2讲) 数列练习

第一题 斐波那契数

有了数学公式,直接递归即可;或是创建数组,for循环求出结果

class Solution {
public:
    int fib(int n) {
if (n==0)
{
    return 0;
}
if (n==1)
{
    return 1;
}
else
{
    return fib(n-1)+fib(n-2);
}
    }
};
class Solution {
public:
    int fib(int n) {
        int f[31];
f[0]=0;
f[1]=1;
for(int i=2;i<=n;i++)
{
    f[i]=f[i-1]+f[i-2];
}
return f[n];
    }
};

第二题 第 N 个泰波那契数

刚开始直接递归,结果因为递归深度太大导致超时。

然后对递归公式进一步进行了推导:T(n+3)=T(n+2)+T(n+1)+T(n),T(n+4)=T(n+3)+T(n+2)+T(n+1),两式相减移项得到T(n+4)=2*T(n+3)-T(n),所以有新的递推公式T(n)=2T(n-1)-T(n-4)。

提交时又出现了新问题,输入为37时,2*T(36)已经超出了int的范围,所以需要转为long型变量。

class Solution {
public:
    int tribonacci(int n) {
        //直接递归会超时
//    if(n<=0)
//        return 0;
//    if(n==1 || n==2)
//        return 1;
//    return tribonacci(n-1) + tribonacci(n-2) + tribonacci(n-3);

if(n==0)
{
    return 0;
}
else if(n==1||n==2)
{
    return 1;
}
else if(n==3)
{
    return 2;
}
else if(n==4)
{
    return 4;
}
else
{
    return 2*(long)tribonacci(n-1)-tribonacci(n-4);
}
    }
};

第三题 求1+2+…+n

要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。直接递归即可。

    int sumNums(int n) {
        if(n==0)
            return 0;
        else
            return n+sumNums(n-1);
    }

第四题 单调数列

想遍历一遍数列,若既遇到了nums[i-1] < nums[i]又遇到了nums[i-1] > nums[i]既不是单调递增的,也不是单调递减的。

class Solution {
public:
    bool isMonotonic(vector<int>& nums) {
        bool inc=true,dec=true;
        int n = nums.size();
    for(int i=1;i<n;i++)
    {
        if(nums[i-1] < nums[i])
            {dec=false;}
        if(nums[i-1] > nums[i])
            {inc=false;}
    }
return dec||inc;
    }
};

第五题 解压缩编码列表

class Solution {
public:
    vector<int> decompressRLElist(vector<int>& nums) {
        vector<int> ans;
        for (int i = 0; i < nums.size(); i += 2) {
            for (int j = 0; j < nums[i]; ++j) {
                ans.push_back(nums[i + 1]);
            }
        }
        return ans;
    }
};

相关知识点:vector 

v.insert(p,t)
//在迭代器p所指处插入值为 t 的元素
v.insert(p,n,t)
//在迭代器p所指处插入n个值为t的新元素
v.insert(p,b,e)
//在迭代器p所指向的元素前面插入迭代器b和e标记的范围内的元素
//注意这种插入是,将[b,e)段内的值插入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值