想法都写在注释里面啦~~ 就不画图了
import java.util.*;
// 主要 考虑的 是 每步 n - 1 怎么走 ?
// 1 层 怎么走 ?
public class Solution {
private static ArrayList<String> list = new ArrayList<>();
public ArrayList<String> getSolution(int n) {
// write code here
// 逐步分解子问题 知道 一个该咋走吧 作为 递归终结者。
//整体从左到右 就写从左到右
leftToRight(n);
return list;
}
private void leftToRight(int n) {
if (n == 1) {
list.add("move from left to right");
return;
}
// 剩下 n - 1 个 小的压大的 给 n == 1 让路
// 怎么 走 ? 走法 一样 先让最后一个走 剩下的让路
leftTomid (n - 1);
// 走到中间了 送走底层去他相应的位置 好 怎么去下一个位置 mid to right 让 n - 1 去下一个位置
list.add("move from left to right");
midToRight(n - 1);
}
private void leftTomid(int n) {
if (n == 1) {
list.add("move from left to mid");
return;
}
// 也是 让路 原则 n - 1 去哪 ? 去右边 刚开始 是 n 每个柱子上都没有 盘子
leftToRight( n - 1);
list.add("move from left to mid");
rightTomid(n - 1);
}
private void rightToLeft(int n) {
if (n == 1) {
list.add("move from right to left");
return;
}
rightTomid(n - 1);
list.add("move from right to left");
midToleft(n - 1);
}
private void rightTomid(int n) {
if ( n == 1) {
list.add("move from right to mid");
return;
}
// 怎么去 让路
rightToLeft(n-1);
// 再来
list.add("move from right to mid");
leftTomid(n-1);
}
private void midToRight( int n ) {
if (n == 1) {
list.add("move from mid to right");
return;
}
// 和上面 一样 剩余的让路
midToleft( n - 1);
list.add("move from mid to right");
leftToRight( n - 1);
}
private void midToleft(int n) {
if ( n == 1) {
list.add("move from mid to left");
return;
}
// 怎么去 让路
midToRight( n - 1);
list.add("move from mid to left");
rightToLeft(n - 1);
}
}
博客围绕Java和LeetCode算法展开,虽无具体内容,但可知涉及Java语言在LeetCode算法题中的应用,能帮助开发者提升算法能力和编程技巧。
1914

被折叠的 条评论
为什么被折叠?



