一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:
青蛙每次只会跳1级或2级,则跳n级必定是所有的1级和2级之和
设f(0)=1
跳上1级只有1种跳法(0->1) => f(1)=1
跳上2级有2种跳法(0->1->2,0->2)=> f(2)=f(1)+f(0) => f(2)=2
跳上3级有3种跳法(0->1->2->3,0->1->3,0->2->3)=> f(3)=f(2)+f(1)
跳上4级有5种跳法(0->1->2->3->4,0->1->2->4,0->1->3->4,0->2->3->4,0->2->4)=> f(4)=f(3)+f(2)
...
跳上n级有:f(n)=f(n-1)+f(n-2)
结果是斐波那契数列
斐波那契数列及优化(不考虑大数)
- 常见递归实现
1 | int fibon(int n) { |
- 优化1
1 | int fibonacci(int n) { |
- 优化2
1 | int fibonaccii(int n) { |
- 优化3
是优化2的递归版本
1 | int fibonac(int a, int b, int n) { // a、b都取1 |
拓展: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:
设f(0)=1
跳上1级只有1种跳法(0->1) => f(1)=1
跳上2级有2种跳法(0->1->2,0->2)=> f(2)=f(1)+f(0) => f(2)=2*f(1)
跳上3级有4种跳法(0->1->2->3,0->1->3,0->2->3,0->3)=> f(3)=f(2)+f(1)+f(0) => f(3)=2*f(2)
跳上4级有8种跳法(0->1->2->3->4,0->1->2->4,0->1->3->4,0->1->4,0->2->3->4,0->2->4,0->3->4,0->4)=> f(4)=f(3)+f(2)+f(1)+f(0) => f(4)=2*f(3)
...
跳上n级有:f(n)=f(n-1)+f(n-2)+...+f(0) => f(n)=2*f(n-1)
解法:
1 | // 递归方式 |
计算字符串中最长非重复子串长度
给定一个字符串,找到最长子串的长度,而不重复字符。
例子:
给定“abcabcbb”,答案是“abc”,长度为3。
给定“bbbbb”,答案是“b”,长度为1。
给定“pwwkew”,答案是“wke”,长度为3.请注意,答案必须是子字符串,“pwke”是子序列而不是子字符串。
- 正常解法
1 |
|
因为字符串中字符大、小写字母都是在ASCII码中前128位里,于是产生了优化算法。
- 优化
1 | int longestSubStringLength1(const char *str) { |