开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
1、写在前面
大家好,这里是【LeetCode刷题日志】。今天的题分别是:
- 斐波那契数
- 爬楼梯
- 最大子数组和
2、内容
2.1、题目一:斐波那契数
(1) 描述
(2) 举例
(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;
}
};
公式法
根据斐波那契数的求解(通项)公式,我们可以解出这道题,代码如下。
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、题目二:爬楼梯
(1) 描述
(2) 举例
(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、题目三:最大子数组和
(1) 描述
(2) 举例
(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、写在最后
好的,今天就先刷到这里。