非商業,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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。