Day32

回溯算法part06

LC332重新安排行程(未掌握)

  1. 未掌握分析:得到了所有可能的行程,但是从所有可能的行程中找出最合适的行程没有任何思路
  2. 代码
    • 代码本质跟LC46全排列有点相似,都是找出符合实际情况的机票排列组合,不同的是需要添加origin站点要求,以及递归终止条件需要单独再创建一个List来替代mid,不然最后一个目的地无法加上

在这里插入图片描述

  1. 改进思路:对tickets进行排序,排序规则是按照a.get(1)和b.get(1)
    • Collections.sort(tickets, (a, b) -> a.get(1).compareTo(b.get(1)));
    • 但是如果tickets中存在好几张相同的从某个机场到某个机场的机票将会导致算法陷入死循环
  2. 递归函数的返回值:我们只要找到了符号实际情况的叶子节点就直接返回,因此递归函数的有返回值的,这样可以避免相同机票排序后导致的死循环,反正我们也只需要找到一种合适的情况即可
  3. 优化后的代码
    在这里插入图片描述

LC51 N皇后(未掌握)

  1. 未掌握分析:不知道如何使用排列+回溯的方式处理,写过多次了还是不能在10min解决
  2. 思路:
    • 暴力:遍历n,每一次的遍历过程中的行row都判断col从0-n能否放皇后
    • 因此递归需要一个row,每一次都从0-n进行遍历
    • 递归终止条件,row==n
  3. 代码
    • 一维数组填充元素:Arrays.fill(nums,‘.’);
      在这里插入图片描述

LC37解数独(未掌握)

  1. 未掌握分析:
    • 递归函数的返回值这点需要格外注意,类似于LC332重新安排行程,只要找到一个符合的结果就返回,因此返回值设置为boolean。
    • 单层递归逻辑判断错误,直接使用两个for循环来定义行和列即可,而不是使用两个int类型的参数
  2. 递归的返回值:因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,所以需要使用bool返回值。
  3. 递归单层搜索逻辑:层级遍历是从0-9,每次需要递归的是一个二维数组,一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,一行一列确定下来之后,递归遍历这个位置放9个数字的可能性!
  4. 9个数都试完了,都不行,那么就返回false
  5. 遍历完没有返回false,说明找到了合适棋盘位置了
  6. 遍历‘0’-‘9’的所有char类型:for(char i=‘1’;i<=‘9’;i++)
  7. 代码
    在这里插入图片描述
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值