解完 LeetCode 2022 年最后一道题,我升华了

86 阅读3分钟

「回顾2022,展望2023,我正在参与2022年终总结征文大赛活动

今天过的特别地狱。凌晨 4 点突然被右下腹疼醒,直觉告诉我是尿路结石发作了,于是喝了两杯热水,帮助排石。结果热水下肚后,开始呕吐,一开始只是呕出喝进去的清水,后来呕出淡绿色液体,很苦,最后变成干呕。我也是后来才知道,这绿色的东西是胆汁。

然后,开始全身冒汗,疼得越来越厉害,疼的我感觉我要挂了,越来越恐惧。

于是叫了救护车,来到急诊,排队期间,又开始干呕,疼的想在地上打滚。

打了两针止疼药,验血验尿拍CT,等化验结果……期间一直祈祷,千万别是阑尾炎和肠梗阻之类的,也不是啥诡异的新冠后遗症,我不想做手术,也不想死😭😭😭

验血验尿拍 CT

验尿的过程特别痛苦,我根本没有尿意,而且一喝水就呕吐,考虑到反正都是清水,每次呕上来我都逼着自己咽下去,这样在三个小时内灌了自己五瓶矿泉水,冷的那种,肚子都涨的不行了,依然没尿意,医生最后说我不用尿检了,帮我退了单。

而且止痛针特别贵,打完后还感觉晕晕乎乎的,世界一片模糊,心疼我自己。

这经历真的太地狱了,大龄单身失业北漂狗,一个人自己叫救护车,期间还在救护车疼到忍不住发出奇怪的声音,极度羞耻😭希望这是我人生中第一次上救护车,也是最后一次。

如果希望达不成,那希望下次上救护车时,能有心爱的人或者最好的朋友在身边。

好在最后 CT 发现确实是肾结石,不大,4mm,血检也没问题,不用手术,感谢老天。

回家后,惊觉已经是 2022 这个失业大半年的年份的最后一天了,记起了今天的每日一题并打开:

LeetCode2037. 使每位学生都有座位的最少移动次数

截屏2023-01-01 09.08.05.png

因为一天没怎么吃东西,加上打了止疼针,头还是有点晕,光理解这道题费了好大力气。高清题意,关键是要搞清楚“座位”和“位置”,在本题中是两个概念。位置只是一些坑,一个坑里可以放多个座位和学生。

然后躺在床上个绞尽脑汁想了 10 分钟,感觉这完全不像是简单题,闭上眼睛在脑子里思考,还差点睡着。感觉今天一整天都想闭上眼睛。

最后灵机一动,注意到了题目中“最少”二字。最值问题,想着这不是用动态规划,就是用贪心算法。鉴于这道题被标为简单题,配不上动态规划这种核武器,所以往贪心的方向想:既然要移动次数最小,那可以让每个学生都尽可能移动到最接近自己的座位即可。思路就这样被我不太聪明的大脑分泌出来了。

排序+贪心,尽可能让位置最小的学生引动到最小的座位。

我居然和官解几乎一摸一样,除了变量名,开心😄:

/*
执行用时:2 ms, 在所有 Java 提交中击败了97.41%的用户
内存消耗:41.7 MB, 在所有 Java 提交中击败了5.60%的用户
通过测试用例:262 / 262
*/
class Solution {
    public int minMovesToSeat(int[] seats, int[] students) {
        int n = seats.length;
        Arrays.sort(seats);
        Arrays.sort(students);
        int ret = 0;
        for(int i = 0; i < n; i++){
            ret += Math.abs(students[i] - seats[i]);
        }
        return ret;
    }
}

这道题的思考过程告诉我,算法其实是有固定“套路“和“模板“的,没有思路时,把所有经典算法在脑海里套一遍,思路说不定就产生了。这个套的过程,既可以是深度优先的,也可以是广度优先的,人在解决难题时候的思维方式,其实也不外乎这两种策略而已

不管是深度优先,还是广度优先,这些被搜索的图节点,都需要尽可能地多,这样才能提高包含正确节点的概率。

经典算法就是思维中的“图节点“,经典算法掌握的越多,套成功的概率就越高。

感觉我一下子升华了🤣

《算法导论》第三版的前 26 章,介绍的就是经典算法。到目前为止,我已经啃了这 26 章的 8 成了,我这失业半年来没日没夜的努力白费。

好几次被鄙视竞赛分数低,明年我一定会找到工作的,也一定会拿到 LeetCode 的Guardian 奖章的。我可以的。💪🏻💪🏻。

最后,祝各位小伙伴:

节日快乐

「回顾2022,展望2023,我正在参与2022年终总结征文大赛活动