¶剑指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 <= 200
0 < 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)