开头先说说一下感想吧,正式开始养成刷leetcode的习惯大概从国庆开始吧,如今也终于破百,刷了110道题,记得刚开始的时候被各种指针折磨,也曾想过放弃,好在最终坚持下来。
基本路线 链表->二叉树->再刷了部分回溯->最近入门动态规划
刷链表是熟悉指针操作,而刷二叉树主要在于锻炼你的框架思维,从宏观把握,二叉树大多为递归题目,学习的数据结构的小白可以试着刷刷看呀,体验从痛苦到上瘾道路。刷题不易但也不要放弃贵在坚持,加油各位兄弟。
动态规划入门可以选择leetcode的一个动态规划刷题指南,也可以看英雄哥的动态规划入门
什么你居然秒懂英雄哥的夜深人静学算法动态规划入门??,不过难度也是不小哟。
动态规划入门我们需要了解基本的递推思想
比如斐波那契数列
F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1
这个公式就是我们平时在刷动态规划题中求得状态方程F(n)的状态与n-1和n-2有关,我们只需要考虑n-1和n-2的状态即可,层层往前递推可有n递推至0;
在比如爬楼梯问题
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
假设我们现在要爬到n层楼梯,那么存在两种情况我们从n-1层爬一步上去,或者从n-2层爬两步上去,那么我们到达n层的走法就转变成 我们到达n-1层的走法的基础上每种走法向上走一步,加上到达n-2层的走法的基础上向上走两步,由此递推关系为
a [ n ] = a [ n - 1 ] + a [ n - 2 ]
这就是递推思想
练练?
509. 斐波那契数
509题解
long fib(int n){
if(n==0) return 0;
if(n==1) return 1;
long a[31];
a[0]=0,a[1]=1;
for(int i=2;i<=30;i++) a[i]=a[i-2]+a[i-1];
long result=a[n];
return result;
}
70题解
int climbStairs(int n){
int a[10001];
a[1]=1;
a[2]=2;
for(int i=3;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
return a[n];
}