问题描述:
在经典汉诺塔问题中,有 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