第一场 LeetCode 周赛

回顾第一次参加LeetCode周赛(中国区153场), 以及这个月的刷题总结

结果与过程

首先是结果,总用时1小时36分,中国区的全国排名是23,全球排名为167。

其中全国有效的参与人数(起码做出1个题)为850人,全球范围则是4213人

ranking

这个结果确实是没想到,有点出道即颠峰的感觉 😀

虽然做着有点磕巴,但前三题看到题面,基本上第一直觉就是相对比较正确的思路。

做完三个题,就第一次参加,已经不错了,所以最后一个题就看看。

当时才20个人做出来,想题的时候还会开小差,就算我做不出来就不会太差吧。没想到后来还有了思路,在最后4分钟里成功提交,有一个bug是因为要求无解返回-1,我返回了False。

综合起来题目都不是那种考edge case的题目,自己状态、运气也都不错,能得这么个成绩我已经满意了。

一点想法

上个月初,对刷题做了一个总结,做了花花的90题。这个月也没有放松,前20多天继续做了花花的DP和Graph,基本上完成了花花列表的80%~90%。

后面几天就是random pick,随机一些好评率比较高的题,和刷过的题有关的话,就复习一下。还集中做了关于monotonic stack/queue的题,技巧性有点高,不怎么熟。

今天比赛的结果也给自己一些鼓励和自信吧,为了避免下一次惨烈翻车,打回原形,之后计划以复习为主,random pick为辅,再把基础夯实在一些。

heatmap.png

现在回头看这两个月的练习还是点作用的吧,还要加油。

题解思路

  • 第一题,从起点,向左右两个方向出发,取两个路程的最小值
  • 第二题,输入的下限是1971年1月1日,为星期五,所以计算从初始日到输入日期的总天数,对7取模
  • 第三题,最后最多删除一个数,那么就把问题分为解为,删除arr[i]所能得到的最大子数组之和,由两部分组成,以arr[i-1]结尾的最大子数组之和(记为end[i-i]),加上,以arr[i+1]开始的最大子数组之和(记为start[i+1]),如果不删除,就是(end[i] + start[i] - arr[i]), 在两种结果中取最大值,就是单独考虑arr[i]的结果,遍历全部arr元素,可以得到全局最优。start、end数组都可以在O(n)时间内得到
  • 第四题,思路是尝试把arr1[i]换为保证arr1为严格递增的最小元素(从arr2中选择),所谓尝试,就是在换与不换中取最小值,所以是个dp问题。之所以选择最小元素,是因为可以最大限度保证后续的元素不用更换。dp[n]表示arr1结尾数字为n时,所累积的最小操作数,对于当前数,只要能继续保持arr1递增,可以不更换,使用arr1p[i],操作数不变,也可以从arr2中用二分查找找比n大的元素加入arr1,操作数加1。如果两条路都找不到,就返回-1

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!