LeetCode 70:階段を登ります

あなたは階段のケースを登っています。それはトップに到達するためにn個の手順を実行します。

たびに1つのまたは2のいずれかのステップを登ることができます。あなたが一番上に登ることができますどのように多くの異なる方法で?

注:与えられたnは正の整数になります。

例1:

入力:2
出力:2
説明:トップに登るには、2つの方法があります。

  1. + 1、ステップ1、ステップ
  2. 2つの手順
    例2:

INPUT :. 3
出力:. 3
説明:3つの方法がトップに登ることがあります。
3. STEP + 1 1 1 + STEPステップ。
4 STEP 1 + 2つのステップ。
5.ステップ+ 1つのSTEP 2。
これが問題の階段であり、そのインタビューキビ中に発生した18年は、インタビュアーが言ったときに、この質問には、自分の無知力の表情を聴いたときに、インタビュアーが、その後、独自の問題解決のアイデアを終え、北京に列車の裏に昨日少し転落しましたこの質問は、今日はそれを記録に見られます。
列の数は、その後のいずれかからn層方式に登り、あなたが1つのまたは2つのステップを登ることができるので、それは、n層を登る方法を、n層のはしごがあると仮定して、フィボナッチ行為に非常によく似ているという事実と問題N-1層、ステップアップ、あるいはN-2層2つのステップアップから、それは引き上げ非常に簡単な漸化式であるので:DP [N] = DP [ N-1] + DP [N- 2]。
Javaのソリューション1:

public static int climbStairs(int n) {
        if (n == 1) {
            return 1;
        }
        int dynamicArray[] = new int[n + 1];
        dynamicArray[1] = 1;
        dynamicArray[2] = 2;
        for (int i = 3; i <= n; i++) {
            dynamicArray[i] = dynamicArray[i - 1] + dynamicArray[i - 2];
        }

        return dynamicArray[n];
    }

それは、BAに割り当てなければならないので、我々は、元に割り当てられた格納プロセス値、B + Bに割り当てられた最初の値、及びBにのみ2つの整数の変数aとbとのさらなる最適化空間、缶。これは、代わりにすべての値を記憶する、上記の積算処理をシミュレートし、次のようにコードは参照:
Javaの解決策2:

public class Solution {
    public int climbStairs(int n) {
        int a = 1, b = 1;
        while (n-- > 0) {
            b += a; 
            a = b - a;
        }
        return a;
    }
}

若しくは

 public static int climbStairs4(int n) {
            int a = 1, b = 1;
            while (--n > 0) {
                b += a;
                a = b - a;
            }
            return b;
        }

もちろん、キャッシュにする方法の配列を使用し
たJavaソリューションを3

public class ClimbingStairs {

    public static int climbStairsWithRecursionMemory(int n) {
        int[] memoryArray = new int[n + 1];
        return subClimbStairsWithRecursionMemory(n - 1, memoryArray) + subClimbStairsWithRecursionMemory(n - 2, memoryArray);

    }

    public static int subClimbStairsWithRecursionMemory(int n, int[] memoryArray) {
        if (n == 1) {
            return 1;
        } else if (n == 2) {
            return 2;
        } else {
            if (memoryArray[n] > 0) {
                return memoryArray[n];
            }
            memoryArray[n] = subClimbStairsWithRecursionMemory(n - 1, memoryArray) + subClimbStairsWithRecursionMemory(n - 2, memoryArray);

            return memoryArray[n];
        }
    }
}

他の方法もあります
記事を参照してください。アルゴリズム:階段(階段)ソリューションの6種類の登山
階段の問題クライミング70クライミング階段を
https://leetcode.com/problems/climbing-stairs/solution/を

公開された80元の記事 ウォンの賞賛140 ビュー640 000 +

おすすめ

転載: blog.csdn.net/linjpg/article/details/104754312