【搞定算法】機器人走路問題

博主秋招提前批已拿百度、字節跳動、拼多多、順豐等公司的offer,可加微信:pcwl_Java 一起交流秋招面試經驗,可獲得博主的秋招簡歷和複習筆記。 

給定四個參數N、P、M、K。表示:
N : 一共有1~N個位置
P : 一共有P步要走
M : 機器人初始停留在M位置上
K : 機器人想要去的位置是K
題目:已知,如果機器人來到 1 位置,那麼下一步一定會走到 2 位置。如果機器人來到 N 位置,那麼下一步一定會走到 N - 1 位置;如果機器人在中間的位置,那麼下一步既可以走向左,也可以走向右。請返回,機器人如果初始停留在 M 位置,經過 P 步之後,機器人來到 K 位置的走法有多少種。

  •  遞歸實現

public class RobotWork {

    /**
     * @param N :共N個位置
     * @param M :開始位置
     * @param P :可以走的步數
     * @param K : 目標位置
     * @return
     */
    public static int walk(int N, int M, int P, int K){
        if(P == 0){
            // basecase
            return M == K ? 1 : 0;
        }
        // 開始位置和結束位置只能往一個方向走
        if(M == 1){
            return walk(N, M + 1, P - 1, K);
        }else if(M == N){
            return walk(N, M - 1, P - 1, K);
        }
        // 向左走和向右走兩種選擇
        return walk(N, M + 1, P - 1, K) + walk(N, M - 1, P - 1, K);
    }
}
  • 動態規劃實現

public class RobotWork {

    public static int walkDP(int N, int M, int P, int K){
        // 從遞歸的過程看:變量有 M 和 P
        int dp[][] = new int[N + 1][P + 1];
        // basecase:當在目標位置,還剩一步的時候
        dp[K][0] = 1;
        for(int j = 1; j <= P; j++){
            for(int i = 1; i <= N; i++){
                if(i - 1 < 1){
                    // 在第一個位置上
                    dp[i][j] = dp[i + 1][j - 1];
                }else if(i + 1 > N){
                    // 在最後一個位置上
                    dp[i][j] = dp[i - 1][j - 1];
                }else{
                    dp[i][j] = dp[i + 1][j - 1] + dp[i - 1][j - 1];
                }
            }
        }
        return dp[M][P];
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章