二, 数列

509. 斐波那契数

斐波那契数 (通常用 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){
    int f[31],i;
    f[0] = 0;
    f[1] = 1;
    for(i=2;i<=n;++i){
        f[i] = f[i-1] + f[i-2];
    }
    return f[n];
}

1137. 第 N 个泰波那契数

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

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

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

int tribonacci(int n){
        int f[38] ;
        f[0] = 0;
        f[1] = f[2] = 1;
        for(int i = 3; i <= n; i++){
            f[i] = f[i-1] + f[i-2] + f[i-3];
        } 
        return f[n];
    }

 剑指 Offer 64. 求1+2+…+n

1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

int sumNums(int n) {
    n && (n += sumNums(n - 1));
    return n;
}
//&&可以相当于if
例:
a < 1 && a = 5 ====>if(a < 1){
                              a = 5;
                              } 

 896. 单调数列

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

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

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

bool isMonotonic(int* nums, int numsSize){
    int i;
    for(i = 1;i<numsSize;++i){
        if(nums[0]<nums[numsSize-1]){ 
            if(nums[i]>=nums[i-1]){ //注意此处的判断符号
                continue;
            }else{
                return false;
            }
        }else if(nums[0]>nums[numsSize-1]){
            if(nums[i]<=nums[i-1]){//此处也注意
                continue;
            }else{
                return false;
            }
        }else{//题目中i>=j,nums[i]>=nums[j],可以都是相等的情况
            if(nums[i]!=nums[0]){
                return false;
            }
        }         
    }
    return true;
}

 1313. 解压缩编码列表

给你一个以行程长度编码压缩的整数列表 nums 。

考虑每对相邻的两个元素 [freq, val] = [nums[2*i], nums[2*i+1]] (其中 i >= 0 ),每一对都表示解压后子列表中有 freq 个值为 val 的元素,你需要从左到右连接所有子列表以生成解压后的列表。

请你返回解压后的列表。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* decompressRLElist(int* nums, int numsSize, int* returnSize){
    int i,j,k=0;
    *returnSize = 0;
    for(i = 0;i<numsSize;i+=2){
        *returnSize+=nums[i];
    }
    int *ret = (int*)malloc(sizeof(int)*(*returnSize));
    for(i = 0;i<numsSize;i+=2){
        for(j=0;j<nums[i];j++){
            ret[k++] = nums[i+1];
        }        
    }
    return ret;
}

 829. 连续整数求和

给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 

int consecutiveNumbersSum(int n){
    int i,res=0; 
    for(int i=sqrt(2*n);i>=1;i--){
        if((n-(i*(i-1)/2))%i==0)res++;
    }
    return res;
}

   利用等差数列求和公式,即为k*i + (i*(i-1)/2) == n 成立的时候,这个连续的i个数即满足要求。那么我们只需要枚举i, 检查此时k是否为整数即可 。如果k为整数,我们就得到了一个最小的那个数为k,总长度为i且和为n的数列了。而我们k的最小值是1, 所以可以把1带进去可以求得i的上限 ,大概为sqrt(2*n) .

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一窝Q

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

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

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

打赏作者

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

抵扣说明:

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

余额充值