目录
用两个栈实现队列
题目:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
题解:
当发生Push和Pop操作时,对两个栈实现一次数据置换操作,实现队列的先进先出。
完整代码:
class Solution
{
public:
void push(int node) {
while(!stack2.empty()) {
stack1.push(stack2.top());
stack2.pop();
}
stack1.push(node);
}
int pop() {
while(!stack1.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
int result = stack2.top();
stack2.pop();
return result;
}
private:
stack<int> stack1;
stack<int> stack2;
};
旋转数组最小的数字
题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
题解:
二分法(注意边界条件的选择)
完整代码:
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int n = rotateArray.size();
int l = 0;
int r = n - 1;
while(l < r) {
int mid = (l + r) / 2;
if(rotateArray[mid] < rotateArray[r]) {
r = mid;
} else if(rotateArray[mid] > rotateArray[r]) {
l = mid + 1;
} else {
r -= 1;
}
}
return rotateArray[l];
}
};
斐波那契数列
题目:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n<=39
题解:
方法一:迭代,记忆化搜索
方法二:动态规划
完整代码:
class Solution {
// 方法一:记忆化搜索
/*
public:
int Fibonacci(int n) {
if(n == 0) {
m[0] = 0;
return m[0];
}
if(n == 1) {
m[1] = 1;
return m[1];
}
if(m.find(n) != m.end()) {
return m[n];
}
int result = Fibonacci(n - 1) + Fibonacci(n - 2);
m[n] = result;
return m[n];
}
private:
map<int, int> m;
*/
// 方法二:动态规划
public:
int Fibonacci(int n) {
vector<int> dp(n + 1);
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
跳台阶
题目:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
题解:
方法一:动态规划
方法二:回溯
完整代码:
class Solution {
public:
// 方法一:动态规划
/*
int jumpFloor(int number) {
if(number <= 2) {
return number;
}
vector<int> dp(number, 0);
dp[0] = 1;
dp[1] = 2;
for(int i = 2; i < number; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[number - 1];
}
*/
// 方法二:回溯
int result = 0;
int jumpFloor(int number) {
jump(number, 0);
return result;
}
void jump(int number, int tmp) {
if(tmp == number) {
result += 1;
return;
}
if(tmp > number) {
return;
}
jump(number, tmp + 1);
jump(number, tmp + 2);
}
};