leetcode 算法第二讲数列

 题目一:

斐波那契数

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给你 n ,请计算 F(n) 。

 题目不难,用移动框的方法足以解决

解题代码:

int fib(int n) {
    if (n < 2) {
        return n;
    }
    int p = 0, q = 0, r = 1;
    for (int i = 2; i <= n; ++i) {
        p = q;
        q = r;
        r = p + q;
    }
    return r;
}

 

题目二:

第 N 个泰波那契数

泰波那契序列 Tn 定义如下: 

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

 和斐波那契的方法一样

解题代码:

int tribonacci(int n){
if(n<2)
return n;
if(n==2)
return 1;
int a,b=0;int c=1;int t=1;
for(int i=3;i<=n;i++)
{
  a=b;
  b=c;
  c=t;
  t=a+b+c;
}
return t;
}

 题目三:

单调数列

如果数组是单调递增或单调递减的,那么它是单调的

如果对于所有 i <= jA[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= jA[i]> = A[j],那么数组 A 是单调递减的。

当给定的数组 A 是单调数组时返回 true,否则返回 false

此题也很简单,加个计数器对递增递减进行判断即可

解题代码:

bool isMonotonic(int* nums, int numsSize){
int i=0;
int count=0;
int ret=0;
for(i=0;i<numsSize;i++)
{
    if(i+1<numsSize)
   {
       if(nums[i]<=nums[i+1])
       count++;
       if(nums[i]>=nums[i+1])
       ret++;
   }
}
if(count==numsSize-1||ret==numsSize-1)
return true;

return false;
}

 

题目四:

连续整数求和

给定一个正整数 N,试求有多少组连续正整数满足所有数字之和为 N?

输入: 5
输出: 2
解释: 5 = 5 = 2 + 3,共有两组连续整数([5],[2,3])求和后为 5。

 题目本身做起来并不难,暴力求解,一个个加然后判断即可。

解题代码1:

int consecutiveNumbersSum(int n){
int i=0;
int j=0;
int count=0;
for(i=1;i<=n/2;i++)
{
    int sum=0;
    int i_=i;
   while(1)
   {
     sum+=i_++;
     if(sum>=n)
     break;
   }
   if(sum==n)
   count++;
}
return count+1;
}

 此代码能的出正确结果,但提交时会超时,所以我们要选择另一种方法:找规律

首先,最小的两个连续正整数相加1+2=3,大点的就是2+3=5=1+2+2,再大点3+4=7=2+3+2=1+2+(2+2),从中可以看出如果存在两个连续正整数之和等于N,那么必然N=1+2+2k(k为正整数),N-(1+2)可以整除2,即(N-(1+2))%2 == 0.
往下推,n个连续正整数就是,(N-(1+2+...+n))%n == 0 

 

解题代码2: 

int consecutiveNumbersSum(int N)
{
    int i = 1, s = 0, result = 1;

    while(1)
    {
        s += i++;
        if(N <= s)
        {
            break;
        }
        if( (N-s)%i==0)
        {
            result++;
        }
    }

    return result;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shany-Ming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值