2つのスタックでキューを実装します
問題の説明
2つのスタックを持つキューを実装します。キューの宣言は次のとおりです。キューの最後に整数を挿入し、キューの先頭に整数を削除する機能をそれぞれ完了する2つの関数appendTailとdeleteHeadを実装してください。(キューに要素がない場合、deleteHead操作は-1を返します)
問題解決のアイデア
スタック
:後入れ先出しキュー:先入れ先出し
公式図から直接見てください。
先入れ先出しの目的を達成するために、2つのスタックを使用し、スタック1は新しいデータを格納するために使用され、スタック2はスタック1のデータを反転するために使用されます。具体的には、appendTailの場合、データをスタック1に直接保存し、deleteHeadの場合、最初にスタック2に要素があるかどうかを確認します。スタックに要素がある場合は、要素がない場合は、スタックに要素があるかどうかを確認します。 1、スタック1に要素がある場合スタック2を1つずつポップしてロードし、スタック2を再度ポップします。スタック1に要素がない場合、キューは空です。
コード:
class CQueue {
Deque<Integer> stack1;
Deque<Integer> stack2;
public CQueue() {
//构造函数
stack1 = new LinkedList<Integer>();
stack2 = new LinkedList<Integer>();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if(!stack2.isEmpty()){
int deleteItem = stack2.pop();
return deleteItem;
}else{
// 若栈2为空
while (!stack1.isEmpty()) {
//若栈1不为空,则将栈1弹栈后的元素装进栈2
stack2.push(stack1.pop());
}
}
if (stack2.isEmpty()) //若经过栈1的入栈后栈2还为空,则返回-1,说明队列为空
return -1;
else{
int deleteItem = stack2.pop();
return deleteItem;
}
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
フィボナッチ数列
問題の説明
関数を記述し、nを入力して、フィボナッチ数列のn番目の項(つまり、F(N))を見つけます。フィボナッチ数列の定義は次のとおりです。
F(0)= 0、F(1)= 1
F(N)= F(N-1)+ F(N-2)、ここでN> 1。
フィボナッチ数列は0と1で始まり、次のフィボナッチ数は、前の2つの数を加算することによって得られます。
答えは1e9 + 7(1000000007)を法とする必要があります。計算の初期結果が1000000008の場合は、1を返します。
問題解決のアイデア
式に従って直接動的計画法を使用すると、再帰がタイムアウトします。
class Solution {
public int fib(int n) {
if(n == 0 || n == 1) return n;
int dp[] = new int[n+1];
dp[0] = 0;
dp[1] = 1;
for(int i=2;i<=n;i++)
dp[i] = (dp[i-1] + dp[i-2])%1000000007; //注意题目要求取模
return dp[n];
}
}