Finding all paths down stairs?

后端 未结 13 1496
天命终不由人
天命终不由人 2020-12-13 07:21

I was given the following problem in an interview:

Given a staircase with N steps, you can go up with 1 or 2 steps each time. Output all possible way

13条回答
  •  庸人自扰
    2020-12-13 07:56

    Here is a simple solution to this question in very simple CSharp (I believe you can port this with almost no change to Java/C++). I have added a little bit more of complexity to it (adding the possibility that you can also walk 3 steps). You can even generalize this code to "from 1 to k-steps" if desired with a while loop in the addition of steps (last if statement).

    I have used a combination of both dynamic programming and recursion. The use of dynamic programming avoid the recalculation of each previous step; reducing the space and time complexity related to the call stack. It however adds some space complexity (O(maxSteps)) which I think is negligible compare to the gain.

    /// 
    /// Given a staircase with N steps, you can go up with 1 or 2 or 3 steps each time.
    /// Output all possible way you go from bottom to top
    /// 
    public class NStepsHop
    {
        const int maxSteps = 500;  // this is arbitrary
        static long[] HistorySumSteps = new long[maxSteps];
    
        public static long CountWays(int n)
        {
            if (n >= 0 && HistorySumSteps[n] != 0)
            {
                return HistorySumSteps[n];
            }
    
            long currentSteps = 0;
            if (n < 0)
            {
                return 0;
            }
            else if (n == 0)
            {
                currentSteps = 1;
            }
            else
            {
                currentSteps = CountWays(n - 1) + 
                               CountWays(n - 2) + 
                               CountWays(n - 3);
            }
    
            HistorySumSteps[n] = currentSteps;
            return currentSteps;
        }
    }
    

    You can call it in the following manner

    long result;
    result = NStepsHop.CountWays(0);    // result = 1
    result = NStepsHop.CountWays(1);    // result = 1
    result = NStepsHop.CountWays(5);    // result = 13
    result = NStepsHop.CountWays(10);   // result = 274
    result = NStepsHop.CountWays(25);   // result = 2555757
    

    You can argue that the initial case when n = 0, it could 0, instead of 1. I decided to go for 1, however modifying this assumption is trivial.

提交回复
热议问题