【算法训练 day32 重新安排行程、N皇后、解数独】

今天主要写一下思路了,即使是二刷感觉题目也很难

一、重新安排行程-LeetCode 332

Leecode链接: LeetCode 332

思路

题目要求一条路径能够正好用完所有机票,并且排序最小。考虑根据给出机票信息建立一个由出发点到目的地的映射关系,方便后续遍历。又因为要求排序最小,所以本体最终映射类型为:unordered_map<string,map<string,int>。其中外层string表示出发地名字,内层string表示到达地名字,int表示该机票是否被使用过。然后设置一个vector格式的容器,保存遍历时经过的地址,每次遍历时也从该容器最后一个元素开始寻找下一个目的地。

个人问题

没有想到如何建立这种出发地到目的地的映射关系;对map的c++11遍历的使用不熟悉;

总结

整体比较难,需要留意的点比较多,首先是映射关系的建立,还有如何对map取出元素进行遍历。其次什么时候才算使用完所有机票并且在数组的序列是最小的,这一点比较巧妙,保证最小的操作是映射的内层使用了map,而不是unordered_map,保证了第一个就是最小的string。如果找到了一条路径那么就立即退出,不需要回溯,因为找到了一定是符合题意了。


二、N皇后-LeetCode 51

Leecode链接: LeetCode 51

思路

将棋盘看成数组,将这个二维数组拆成一层一层,每层一维数组代表一层递归,单层递归要做的就是判断在这个位置插入皇后是否合法,合法就插入否则继续遍历,直到本层递归的循环结束。判断找到一个方案的退出条件是行数是否等于棋盘的边长。

个人问题

不知道如何判断斜边是否有元素。

总结

本题需要注意如何判断斜边,主要判断两个方向,一个是左斜上,一个是右斜上。因为如果有元素,一定是上面有元素,所以不需要判断左斜下与右斜下。每层递归都是从第一个元素开始,因为你不知道上一层是不是从第一个开始遍历的,所以需要从第一个开始并判断如果取第一个是否合法。还有一点,判断是否合法时,没有进行同一行的合法判断,因为每次递归都是把下一行传入了函数中,自然就排除了同一行可能有元素的情况。


三.解数独-LeeCode 37

Leecode链接: LeetCode 59

思路

对二维数组使用回溯法,两层for循环逐个对二维数组进行遍历,如果没由元素就从1-9一个一个元素试(显然这也是需要for循环试的),找到合法的元素就插入并进入下一个递归,如果这个位置有元素就跳过。同样的进入下一层递归也需要从头开始判断,有元素跳过否则根据合法情况插入元素。

个人问题

代码没有自己写出来。

总结

题目代码得核心逻辑有点穷举的味道,基本一看就看懂。但是写出来有点繁琐。判断合法主要就是三个方面,一个这行是否有重复原元素,这列是否有重复元素,该元素所处的3*3矩阵中是否由重复元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值