回溯算法part06
LC332重新安排行程(未掌握)
- 未掌握分析:得到了所有可能的行程,但是从所有可能的行程中找出最合适的行程没有任何思路
- 代码
- 代码本质跟LC46全排列有点相似,都是找出符合实际情况的机票排列组合,不同的是需要添加origin站点要求,以及递归终止条件需要单独再创建一个List来替代mid,不然最后一个目的地无法加上
- 改进思路:对tickets进行排序,排序规则是按照a.get(1)和b.get(1)
- Collections.sort(tickets, (a, b) -> a.get(1).compareTo(b.get(1)));
- 但是如果tickets中存在好几张相同的从某个机场到某个机场的机票将会导致算法陷入死循环
- 递归函数的返回值:我们只要找到了符号实际情况的叶子节点就直接返回,因此递归函数的有返回值的,这样可以避免相同机票排序后导致的死循环,反正我们也只需要找到一种合适的情况即可
- 优化后的代码
LC51 N皇后(未掌握)
- 未掌握分析:不知道如何使用排列+回溯的方式处理,写过多次了还是不能在10min解决
- 思路:
- 暴力:遍历n,每一次的遍历过程中的行row都判断col从0-n能否放皇后
- 因此递归需要一个row,每一次都从0-n进行遍历
- 递归终止条件,row==n
- 代码
- 给一维数组填充元素:Arrays.fill(nums,‘.’);
- 给一维数组填充元素:Arrays.fill(nums,‘.’);
LC37解数独(未掌握)
- 未掌握分析:
- 递归函数的返回值这点需要格外注意,类似于LC332重新安排行程,只要找到一个符合的结果就返回,因此返回值设置为boolean。
- 单层递归逻辑判断错误,直接使用两个for循环来定义行和列即可,而不是使用两个int类型的参数
- 递归的返回值:因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,所以需要使用bool返回值。
- 递归单层搜索逻辑:层级遍历是从0-9,每次需要递归的是一个二维数组,一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,一行一列确定下来之后,递归遍历这个位置放9个数字的可能性!
- 9个数都试完了,都不行,那么就返回false
- 遍历完没有返回false,说明找到了合适棋盘位置了
- 遍历‘0’-‘9’的所有char类型:for(char i=‘1’;i<=‘9’;i++)
- 代码