递归-汉诺塔问题(面试题 08.06. 汉诺塔问题)

问题描述:

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:

(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。

示例1:

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

输入:A = [1, 0], B = [], C = []
输出:C = [1, 0]

解题思路:

1)先将n-1个放在B柱子上,然后将第n个直接放在C柱子上,最后,将B柱子的放到C柱子上;

2)终止条件为:当只有一个元素时,直接放置到目标柱子上。

建议:

不要刻意思考位置变换细节,直接将其进行分治思考即可。

Java代码实现流程为:

class Solution {
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        hanotaProcess(A.size(), A, B, C);
    }
    public void hanotaProcess(int num, List<Integer> original, List<Integer> medium, List<Integer> target){
        if(num == 1){
            target.add(original.remove(original.size() - 1));
            return;
        }
        hanotaProcess(num - 1, original, target, medium);
        target.add(original.remove(original.size() - 1));
        hanotaProcess(num - 1, medium, original,  target);
    }
}
java LinkedList的基本知识点:

offer,add区别:

一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。

这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。通常用不上。 

 

poll,remove区别:

remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,

但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

 

peek,element区别:

element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null
借鉴博客地址:
https://blog.csdn.net/qq_36089832/article/details/102011216
原文地址:https://www.cnblogs.com/tomorrow-hope/p/13783384.html