第9题
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
思路:
1、题目一开始就没有读懂。题目解析如下
2、官方思路:
解答:
class CQueue {
stack<int> stack1,stack2;
public:
CQueue() {//建立两个空栈
while(!stack1.empty()){
stack1.pop();
}
while(!stack2.empty()){
stack1.pop();
}
}
void appendTail(int value) {
stack1.push(value);
}
int deleteHead() {
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
}
if(stack2.empty()){
return -1;
}else{
int x=stack2.top();
stack2.pop();
return x;
}
}
};
反思
1、题读不懂
2、平台使用不熟练
3、堆栈和队列不熟练,基本操作和书有出入,要多练习
第10题 斐波那契数列
题目:
我的错误答案:
class Solution {
public:
int fib(int n) {
if(n==0){
return 0;
}
else if(n==1){
return 1;
}
else{
return fib(n-1)+fib(n-2);
}
}
};
超时了
答案:
class Solution {
public:
int fib(int n) {
int a=1000000007;//题目要求取模
int i;
int p=0,q=0,r=1;
if(n==0){
return 0;
}
else if(n==1){
return 1;
}
for(i=2;i<=n;i++){//动态规划法
p=q;
q=r; //q向后挪一位
r=(p+q)%a;//r向后挪一位
}
return r;
}
};
解析:
反思:注意时间复杂度,不能超时。递归法容易超时。
第10题 练习
class Solution {
public:
int numWays(int n) {
int mod=1000000007;
int p=1,q=1,r=1;
if(n==0||n==1){
return 1;
}
else{
for(int i=2;i<=n;i++){
p=q;
q=r;
r=(p+q)%mod;
}
}
return r;
}
};
第30题包含min的函数的栈
答案:
class MinStack {
stack<int> A,B;
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
A.push(x);
if(B.empty()||B.top()>=x)B.push(x);
}
void pop() {
if(A.top()==B.top())B.pop();
A.pop();
}
int top() {
return (A.top());
}
int min() {
return (B.top());
}
};
思路: