一、对于集合的基础认识
1.List 是一个集合的接口。允许存在重复的元素,主要有两种实现类。
ArrayList 与 LinkedList
2.一些常用的方法:
List<Integer> list = new ArrayList<>;
//向集合中添加元素
list.add(element);
//获取元素
list.get(index);
//获取集合的长度
list.size();
//删除集合的元素
list.remove(index);
//清空集合中的元素
list.clear();
//判断集合是否为空
list.isEmpty();
二、LeetCode 面试题 08.06. 汉诺塔问题
核心思想:
(1)汉诺塔问题是一个经典的递归问题,属于分治算法的一种。
(2)将n个盘子从某个柱子上移动到指定的柱子上,将其变为将n-1个盘子移动到辅助的柱子上,把最后一个盘子直接移动到目标柱上。
(3)此时问题的规模就缩小到了这 n-1 个盘子移动到目标数上。
(4)问题的规模为: H(n) = H(n - 1) + 1 + H(n - 1)
代码部分:
class Solution {
public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
//获取源柱上盘子的个数[对于获取集合中元素的个数通过size方法来完成]
int n = A.size();
//调用移动盘子的方法
move(n, A, B, C);
}
public void move(int n, List<Integer> A, List<Integer> B, List<Integer> C){
if(n == 0){
return;
}
//将n-1个盘子移动到辅助柱上
move(n-1, A, C, B);
C.add(0, A.remove(0));
//再将n-1个盘子移动到目标柱上
move(n-1, B, A, C);
}
}
对于代码的执行流程与内存机制分析:
(1)对于递归调用一次,就会生成一个方法栈。
(2)当递归结束后,会返回并销毁方法栈。在返回时会执行整个方法。
(3)具体的执行流程:
假设有3个盘子,有A、B、C三个柱子
(1)在第一次调用move()方法时,对其中两个盘子进行递归处理
move(2, a, c, b)
第二次调用move()方法时,再对一个盘子进行处理
move(1, a, b, c)
第三次调用move()方法时,再次进入递归调用
move(0, a, c, b)
此时 n == 0, 递归调用结束。
(2)函数返回,继续执行下面的代码