第一题 斐波那契数
有了数学公式,直接递归即可;或是创建数组,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)段内的值插入。