
¶剑指offer – 动态规划
¶剑指 Offer 10- I. 斐波那契数列
Difficulty: 简单
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
1  | F(0) = 0, F(1) = 1  | 
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
1  | 输入:n = 2  | 
示例 2:
1  | 输入:n = 5  | 
提示:
0 <= n <= 100
Solution
方法一:递归写法
1  | class Solution {  | 
时间复杂度:$O(2^N)$,指数级别。
空间复杂度:$O(N)$,每一层运算所占用的空间为1,一共要递归 n-1 次;也就是约等于n。
方法二:动态规划
1  | class Solution {  | 
时间复杂度:$O(N)$,N 为数组长度,一次遍历
空间复杂度:$O(N )$,dp 数组所需要的额外空间
方法二:动态规划,滚动数组,空间优化
1  | class Solution {  | 
时间复杂度:$O(N)$,N 为数组长度,一次遍历
空间复杂度:$O(1)$,p,q,r 所需的额外常数空间
方法三:矩阵快速幂

1  | class Solution {  | 
注意:此题使用的快速幂算法与 数值的整数次方 相同。
时间复杂度:$O(\log N)$,二分的时间复杂度为对数级别。
空间复杂度:$O(1)$,res , q, a, ret 等变量都有明确的大小,仅占用常数大小额外空间。
方法四:通项公式
斐波那契数_官方题解__方法三:通项公式
$$
F(n) = \frac{1}{\sqrt{5}}[(\frac{1 + \sqrt{5}}{2})^n - (\frac{1 - \sqrt{5}}{2})^n]
$$
1  | class Solution {  | 
时间复杂度,空间复杂度皆为 $O(1)$。
¶剑指 Offer 10- II. 青蛙跳台阶问题
Difficulty: 简单
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
1  | 输入:n = 2  | 
示例 2:
1  | 输入:n = 7  | 
示例 3:
1  | 输入:n = 0  | 
提示:
0 <= n <= 100
Solution
与斐波那契数列本质相同,更多解法同上。以下是一个常规的动态规划+滚动数组优化空间解法。
1  | class Solution {  | 
时间复杂度:$O(N)$,N 为数组长度,一次遍历
空间复杂度:$O(1)$,p,q,r 所需的额外常数空间
¶剑指 Offer 19. 正则表达式匹配
Difficulty: 困难
请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。
示例 1:
1  | 输入:  | 
示例 2:
1  | 输入:  | 
示例 3:
1  | 输入:  | 
示例 4:
1  | 输入:  | 
示例 5:
1  | 输入:  | 
s可能为空,且只包含从a-z的小写字母。p可能为空,且只包含从a-z的小写字母以及字符.和*,无连续的'*'。
Solution
1  | class Solution {  | 
时间复杂度:$O(MN)$,其中 M 为匹配串的长度,N 为模式串的长度。
空间复杂度:$O(MN)$,dp 矩阵所需要的额外空间消耗。
¶剑指 Offer 42. 连续子数组的最大和
Difficulty: 简单
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
1  | 输入: nums = [-2,1,-3,4,-1,2,1,-5,4]  | 
提示:
1 <= arr.length <= 10^5-100 <= arr[i] <= 100
Solution
1  | class Solution {  | 
时间复杂度:$O(N)$,N 为数组 nums 的长度。
空间复杂度:$O(N)$,dp 所需要的额外空间消耗。
¶剑指 Offer 46. 把数字翻译成字符串
Difficulty: 中等
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
1  | 输入: 12258  | 
提示:
0 <= num < 2^31
Solution
1  | class Solution {  | 
时间复杂度:$O(log_{10}N)$,即 num 的位数。
空间复杂度:$O(1)$,a, b, c, x, y, tmp, 常数个变量所需的额外空间。
¶剑指 Offer 47. 礼物的最大价值
Difficulty: 中等
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
示例 1:
1  | 输入:  | 
提示:
0 < grid.length <= 2000 < grid[0].length <= 200
Solution
动态规划
1  | class Solution {  | 
时间复杂度:$O(M \times N)$,M 为行数,N 为列数。
空间复杂度:$O(M \times N)$ ,dp 所占用的额外空间。
动态规划,空间优化
1  | class Solution {  | 
时间复杂度:$O(M \times N)$,M 为行数,N 为列数。
空间复杂度:$O(1)$ ,原地操作。
¶剑指 Offer 48. 最长不含重复字符的子字符串
Difficulty: 中等
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
1  | 输入: "abcabcbb"  | 
示例 2:
1  | 输入: "bbbbb"  | 
示例 3:
1  | 输入: "pwwkew"  | 
提示:
s.length <= 40000
Solution
1  | class Solution {  | 
时间复杂度:$O(N)$,N 为字符串长度,一次遍历即可
空间复杂度:$O(1)$,哈希表最多存26个字母,因此是仅需要常数额外空间。
¶剑指 Offer 49. 丑数
Difficulty: 中等
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例:
1  | 输入: n = 10  | 
**说明: **
1是丑数。n不超过1690。
Solution
1  | class Solution {  | 
时间复杂度:$O(n)$
空间复杂度:$O(n)$,dp 额外所需的空间复杂度
¶剑指 Offer 60. n个骰子的点数
Difficulty: 中等
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
示例 1:
1  | 输入: 1  | 
示例 2:
1  | 输入: 2  | 
限制:
1 <= n <= 11
Solution
1  | class Solution {  | 

¶剑指 Offer 63. 股票的最大利润
Difficulty: 中等
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
示例 1:
1  | 输入: [7,1,5,3,6,4]  | 
示例 2:
1  | 输入: [7,6,4,3,1]  | 
限制:
0 <= 数组长度 <= 10^5
Solution
1  | class Solution {  | 
时间复杂度:$O(N )$,N 为 prices 长度,一次遍历
空间复杂度:$O(1 )$,minPrice 和 maxPro 所需的
¶参考资料
图解算法数据结构 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 (leetcode-cn.com)