爬楼梯
题目链接:https://leetcode-cn.com/problems/climbing-stairs/
很多题目其实都是于生活息息相关的。这道爬楼梯的题目让我发现,看似简单的楼梯,我其实可以一辈子走的方式不重样(从程序运行结果来看,40阶的台阶就有1亿多种走法)这还是每次只能走一或者二阶台阶的前提下。说实话一开始我是不信的,等到我手动写到8阶楼梯有几种走法的时候,我就信了。确实有点多哈哈~
这道题其实就是裴波那契数列的实例,斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。——copy自百度百科。
class Solution {
public int climbStairs(int n) {
if (n <= 2) {
return n;
}
int i1 = 1;
int i2 = 2;
for (int i = 3; i <= n; i++) {
int temp = i1 + i2;
i1 = i2;
i2 = temp;
}
return i2;
}
}
最大子序列
题目链接 https://leetcode-cn.com/problems/maximum-subarray/
这道题说实话想了好久都没想出来,后来是看了题解才会做的
下面是我看了题解后用动态规划写的代码,代码很简单,关键的一步是那个if判断,有个专业术语叫正数增益。简单的说就是把数组中负数给过滤掉。
public static int maxSubArray(int[] nums) {
int tmp = nums[0];
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
tmp = tmp > sum ? tmp : sum;
if (sum < 0) sum = 0;
}
return tmp;
}
题解中包括题目中说的分治方法我没有看懂,但是不明觉厉,先把题解链接贴上,以后慢慢消化。。