hard题果然是hard题,昨天直接交的题解,今天自己写了一遍,还是犯了很多导致溢出的错误,不过也算理解了吧。
用dfs的搜索方法,同时使用记忆化,避免走重复的路,节约时间。
一般来说,dfs也好bfs也好,我都喜欢用stack和queue循环控制来实现,递归总是让我感觉不可控制,于是这道题我也自然而然地用stack来实现,结果很惨烈,想在循环中对每一个走过的节点进行计数太难了,只能牺牲空间,并且实现非常繁琐,以后还是尽量用递归吧。
再回顾一下思路:
- 建立一个二维数组,存储以对应位置为起点可以走出的最长路径长度是多少,初始化为0.
- 以每一个节点为起始点,用深度优先对路径进行递归,对经过节点的路径长度进行存储
- 循环过程中,若遇见计算过路经长度的节点,跳过计算过程。
昨天偷懒,循环控制没实现成功直接就复制结果了
今天实现了一下递归的方法,中间还是犯了很多低级错误,太马虎了。
- 在将下一个节点投入递归时,没有注意检验数组下标的安全性,导致溢出
- 在存储输入数据的size前,没先判断长度的合法性,先使用了martix【0】,导致溢出。对特殊出入数据的处理一定要在所有行动之前!!!。
真的挺蠢的,再一次证明了我是个马马虎虎的人,以后一定要注意数组下标的溢出
另外,昨天看题也有偏差,一开始当成要计算最长路径经过的点的和,前天的题也有偏差,我真就奇怪,我为啥就不好好看题呢?
另外我终于学到怎样是在dfs,bfs时方便的取得周围的四个或者八个坐标了,原来还能这样!学到了学到了。
class Solution {
public:
static constexpr int dir[4][2] = {
{
-1, 0}, {
1, 0}, {
0, -1},