[56] 2つのスタックを使用してキューを実装する|フィボナッチ数列

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];
    }
}

おすすめ

転載: blog.csdn.net/qq_43424037/article/details/114985321