💯剑指offer第一天
00 min
2023-3-12
2024-4-10
type
status
date
slug
summary
tags
category
icon
password

😈剑指 Offer 09. 用两个栈实现队列

💡
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
1 <= values <= 10000 最多会对 appendTail、deleteHead 进行 10000 次调用
这道题目是经典的数据结构题目。我们可以用两个栈来实现队列的操作。一个栈用来存储入队的元素,另一个栈用来存储出队的元素。当需要出队时,如果出队的栈为空,则将入队的栈中的元素全部弹出并压入出队的栈中。这样,就可以实现队列的先进先出的操作了。时间复杂度为O(n)。
值得注意的是,当需要出队时,如果入队的栈和出队的栈都为空,则返回-1。

解题思路: 栈无法实现队列功能: 栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。 双栈可实现列表倒序: 设有含三个元素的栈A=[1,2,3] 和空栈B=[]。若循环执行A元素出栈并添加入栈B,直到栈A 为空,则A=[]B=[3,2,1] ,即栈B 元素实现栈A 元素倒序 。利用栈B 删除队首元素: 倒序后,B 执行出栈则相当于删除了A 的栈底元素,即对应队首元素。

notion image
函数设计: 题目只要求实现 加入队尾appendTail() 和 删除队首deleteHead() 两个函数的正常工作,因此我们可以设计栈 A 用于加入队尾操作,栈 B 用于将元素倒序,从而实现删除队首元素。
加入队尾 appendTail()函数: 将数字 val 加入栈 A 即可。 删除队首deleteHead()函数: 有以下三种情况。 当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。 否则,当 A 为空: 即两个栈都为空,无元素,因此返回−1 。 否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

😈剑指 Offer 10- I. 斐波那契数列

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0,   F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2 输出:1 示例 2:
输入:n = 5 输出:5
提示:
0 <= n <= 100

方法一:动态规划

斐波那契数的边界条件是F(0)=0 和F(1)=1。当n>1 时,每一项的和都等于前两项的和,因此有如下递推关系:F(n)=F(n−1)+F(n−2)
由于斐波那契数存在递推关系,因此可以使用动态规划求解。动态规划的状态转移方程即为上述递推关系,边界条件为F(0) 和F(1)。
根据状态转移方程和边界条件,可以得到时间复杂度和空间复杂度都是 O(n) 的实现。由于F(n) 只和F(n−1) 与F(n−2) 有关,因此可以使用「滚动数组思想」把空间复杂度优化成O(1)。如下的代码中给出的就是这种实现。
计算过程中,答案需要取模1e9+7。
 
时间复杂度:O(n)。
空间复杂度:O(1)。

方法二:矩阵快速幂

首先我们可以构建这样一个递推关系:
方法一的时间复杂度是O(n)。使用矩阵快速幂的方法可以降低时间复杂度。
notion image
notion image
} 复杂度分析
时间复杂度:O(logn)。
空间复杂度:O(1)。
 

必杀技:

 
上一篇
quarkus 学习(一):前期准备
下一篇
记录NAS-TOOL

Comments
Loading...