【LeetCode刷题日志】:斐波那契数、爬楼梯、最大子数组和

115 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

1、写在前面

大家好,这里是【LeetCode刷题日志】。今天的题分别是:

  • 斐波那契数
  • 爬楼梯
  • 最大子数组和

2、内容

2.1、题目一:斐波那契数

链接:509. 斐波那契数 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

(3) 解题

递归

class Solution {
public:
    int fib(int n) {
        if(n <= 1) return n;
        return fib(n-1) + fib(n-2);
    }
};

动态规划

class Solution {
public:
    int fib(int n) {
        if (n <= 1) return n;
        int sum = 0;
        int first = 0;
        int second = 1;
        for (int i = 2; i <= n; i++) {
            int sum = first + second;
            first = second;
            second = sum;
        }
        return second;
    }
};

公式法

image.png

根据斐波那契数的求解(通项)公式,我们可以解出这道题,代码如下。

class Solution {
public:
    int fib(int n) {
        double a = pow( (1 + sqrt(5)) / 2 , n);
        double b = pow( (1 - sqrt(5)) / 2 , n);
        return (a-b) / sqrt(5);
    }
};

2.2、题目二:爬楼梯

链接:70. 爬楼梯 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

(3) 解题

参考代码:

class Solution {
public:
    int climbStairs(int n) {
        if(n <= 1) return n;
        int sum = 0;
        int first = 1;
        int second = 2;
        for(int i = 3; i<=n; i++) {
            sum = first + second;
            first = second;
            second = sum;
        }
        return second;
    }
};

2.3、题目三:最大子数组和

链接:53. 最大子数组和 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

(3) 解题

参考代码:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result = INT32_MIN; // 子区间最大值
        int num = 0;            // 当前区间总和
        // 遍历数组
        for (int i = 0; i < nums.size(); i++) {
            // num不断求和
            num += nums[i];
            // 如果当前区间的总和大于最大值,则更新最大值
            if (num > result) result = num;
            // 如果当前区间总和小于等于0,则重置num为0
            if (num <= 0) num = 0;
        }
        // 最后返回结果
        return result;
    }
};

3、写在最后

好的,今天就先刷到这里。