LeetCode-漢諾塔問題

 

非商業,LeetCode連接附上:java

https://leetcode-cn.com/problems/hanota-lcci/算法

進入正題。.net

 

題目:code

在經典漢諾塔問題中,有 3 根柱子及 N 個不一樣大小的穿孔圓盤,盤子能夠滑入任意一根柱子。一開始,全部盤子自上而下按升序依次套在第一根柱子上(即每個盤子只能放在更大的盤子上面)。移動圓盤時受到如下限制:
(1) 每次只能移動一個盤子;
(2) 盤子只能從柱子頂端滑出移到下一根柱子;
(3) 盤子只能疊在比它大的盤子上。blog

請編寫程序,用棧將全部盤子從第一根柱子移到最後一根柱子。遞歸

你須要原地修改棧。ci

 

示例:leetcode

示例1:rem

輸入:A = [2, 1, 0], B = [], C = []
輸出:C = [2, 1, 0]
示例2:get

輸入:A = [1, 0], B = [], C = []
輸出:C = [1, 0]
提示:

A中盤子的數目不大於14個。

 

代碼實現:

class Solution {
    
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {

        move(A.size(), A, B, C);
    }

    public void move(int n, List<Integer> original, List<Integer> middle, List<Integer> target) {

        if(n < 1) {
            return;
        }

        move(n - 1, original, target, middle);
        target.add(original.remove(original.size() - 1));
        move(n - 1, middle, original, target);
    }

}
//時間複雜度O(2^n - 1),空間複雜度O(n)

 

分析:

有些問題還能夠迭代,但有些問題只能用遞歸;

思考遞歸的時候,要有意的忽略細節,從更宏觀更高維度着眼,讓計算機、讓算法去實現細節。

 

--End

 

本文同步分享在 博客"黑冰臺"(CNBlog)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索