Leetcode 每日一题和每日一题的下一题刷题笔记 26/30

216 阅读3分钟

Leetcode 每日一题和每日一题的下一题刷题笔记 26/30

写在前面

这是我参与更文挑战的第26天,活动详情查看:更文挑战

快要毕业了,才发现自己被面试里的算法题吊起来锤。没办法只能以零基础的身份和同窗们共同加入了力扣刷题大军。我的同学们都非常厉害,他们平时只是谦虚,口头上说着自己不会,而我是真的不会。。。乘掘金鼓励新人每天写博客,我也凑个热闹,记录一下每天刷的前两道题,这两道题我精做。我打算每天刷五道题,其他的题目嘛,也只能强行背套路了,就不发在博客里了。

本人真的只是一个菜鸡,解题思路什么的就不要从我这里参考了,编码习惯也需要改进,各位如果想找刷题高手请教问题我觉得去找 宫水三叶的刷题日记 这位大佬比较好。我在把题目做出来之前尽量不去看题解,以免和大佬的内容撞车。

另外我也希望有得闲的大佬提供一些更高明的解题思路给我,欢迎讨论哈!

好了废话不多说开始第二十六天的前两道题吧!

2021.6.26 每日一题

773. 滑动谜题

这题有华容道内味了,小时候玩的玩具,记得当时好像玩出什么规律了,螺旋着移动然后就能恢复,现在已经忘光了。。。这个东西应该是有公式的,

类似这种东西 数字华容道有何解法?

当然我们现在要做题的话肯定从这里找解题方法然后写代码是来不及了,这种题要不就是 BFS 要不就是 A*,其实昨天的每日一题也可以用 A*,但是我不是很熟这个算法,就没敢用。那么,在做题之前先介绍一下 A* 算法。

A* 算法的特点是一个起点代价一个终点代价,两个代价函数组成了完整的代价函数。然后终点代价只有在去往终点的路确定了以后才是确定的,所以总代价里面的终点代价实际上是一个估计值,最优的路线上的终点代价就是最好的终点代价。那个估计值函数也叫启发函数,这道题里面启发函数是现在状态里面每个数归位的步数。因为将一个数归位,实际上就是这个数两个位置之间的曼哈顿距离,所以把这个距离的矩阵列出来,后面终点代价就直接对着矩阵读就可以。

[012123101212210321123012212101321210]\begin{bmatrix} 0 & 1 & 2 & 1 & 2 & 3 \\ 1 & 0 & 1 & 2 & 1 & 2 \\ 2 & 1 & 0 & 3 & 2 & 1 \\ 1 & 2 & 3 & 0 & 1 & 2 \\ 2 & 1 & 2 & 1 & 0 & 1 \\ 3 & 2 & 1 & 2 & 1 & 0 \\ \end{bmatrix}

今天这个算法没有彻底搞懂,先用官方题解顶上了。。。

image.png

2021.6.26 每日一题下面的题

剑指 Offer 53 - II. 0~n-1中缺失的数字

这道题用二分查找,缺失的数左边数和序号是对上的,右边是差一个的。也就是说假如全部的数都和序号对上了,那么缺失的是最后一个数。


class Solution {
public:
    int missingNumber(vector<int>& nums) {
        if(nums.empty()) return 0;
        int l = 0, r = nums.size() - 1;
        while(l < r){
            int mid = (l + r) >> 1;
            if(nums[mid] != mid) r = mid;
            else l = mid + 1;
        }
        if(nums[r] == r) r++;
        return r;
    }
};

image.png

小结

A* 算法的终点代价,距离函数的选取,二分查找

参考链接

路径规划之 A* 算法