283场LeetCode周赛
周赛综述&总结:
这次感觉就是从头卡到尾哈哈哈,每个题或多或少都卡了一下,感觉近几次做题真的思想越来越僵化了,也可能和太久没写代码了有关吧,2月轻松了一个月,3月开始真的忙碌了hhh,等哪天闲下来要完整总结下做题用到的一些常用结构了;
看了下有写笔记的是273到283,算上新年鸽了一次正好十次,感觉可以十次总结下,之后找时间先写个新的博客~
第一题:上来就不顺了下,要考虑python怎么做这种字符串的操作,查了一下才知道ord()
可以把字母转化为ASCII表,然后再用chr()
把ASCII字符转换回串,然后实际上是一个简单的二重循环遍历;
第二题:这个题就感受到上难度了hhh,一上来必然很容易想到暴力遍历法,然后看了下数据范围估计超时间复杂度了,之后就是一个想优化的过程,大佬提了下排序后倒是能想到思路,就是直接用求和公式统计下差,然后最后看看全都补完了还剩多少个剩余的,剩余的其实就是现有max+1在往后求和k个就行了,中间写起来细节感觉很多,还是被坑了不少的。另外还有一个哨兵机制,能简化下第一个位置的计算的感觉?;
第三题:好像还是在周赛里第一次见到这种构建的题,这次想到的比较慢,以后应该想构建题就直接搞哈希表(mapping),开始是一种超级暴力的思路,每次找一个节点,都去dfs一遍看看能不能插入,能插入就插入,不能插入就下一个,但实际上mapping后每个value都能找到对应的节点,这样插入的时候实际上就是把“地址”拼接在一起了;
第四题:鸽了鸽了;
第一题:2194.Excel表中某个范围内的单元格
题目大意
Excel 表中的一个单元格 (r, c)
会以字符串 "<col><row>"
的形式进行表示,其中:
<col>
即单元格的列号c
。用英文字母表中的 字母 标识。- 例如,第
1
列用'A'
表示,第2
列用'B'
表示,第3
列用'C'
表示,以此类推。
- 例如,第
<row>
即单元格的行号r
。第r
行就用 整数r
标识。
给你一个格式为 "<col1><row1>:<col2><row2>"
的字符串 s
,其中 <col1>
表示 c1
列,<row1>
表示 r1
行,<col2>
表示 c2
列,<row2>
表示 r2
行,并满足 r1 <= r2
且 c1 <= c2
。
找出所有满足 r1 <= x <= r2
且 c1 <= y <= c2
的单元格,并以列表形式返回。单元格应该按前面描述的格式用 字符串 表示,并以 非递减 顺序排列(先按列排,再按行排)。
示例1:
1 |
|
示例2:
1 |
|
提示:
s.length == 5
'A' <= s[0] <= s[3] <= 'Z'
'1' <= s[1] <= s[4] <= '9'
s
由大写英文字母、数字、和':'
组成
分析和解答
ord("a")
是把一个字符转化为ASCII码表示,例如该句会输出97
chr(97)
是把一个ASCII码(或者也不一定,就是数字)转化为字符表示,例如该句会输出a
知道上边两个操作后怎么遍历就不是难事了,代码如下所示
1 |
|
第二题:6017.向数组中追加K个整数
题目大意
给你一个整数数组 nums
和一个整数 k
。请你向 nums 中追加 k 个 未 出现在 nums 中的、互不相同 的 正 整数,并使结果数组的元素和 最小 。
返回追加到 nums
中的 k
个整数之和。
示例1:
1 |
|
示例2:
1 |
|
提示:
1 <= nums.length <= 10^5
1 <= nums[i], k <= 10^9
分析和解答
这个题就感受到上难度了hhh,一上来必然很容易想到暴力遍历法,然后看了下数据范围估计超时间复杂度了
之后就是一个想优化的过程,大佬提了下排序后倒是能想到思路,就是直接用求和公式统计下差,然后最后看看全都补完了还剩多少个剩余的,剩余的其实就是现有max+1在往后求和k个就行了
中间写起来细节感觉很多,还是被坑了不少的。
另外还有一个哨兵机制,能简化下第一个位置的计算的感觉?;
1 |
|
第三题:2196.根据描述创建二叉树
题目大意
给你一个二维整数数组 descriptions ,其中 descriptions[i] = [parenti, childi, isLefti] 表示 parenti 是 childi 在 二叉树 中的 父节点,二叉树中各节点的值 互不相同 。此外:
- 如果 isLefti == 1 ,那么 childi 就是 parenti 的左子节点。
- 如果 isLefti == 0 ,那么 childi 就是 parenti 的右子节点。
请你根据 descriptions
的描述来构造二叉树并返回其 根节点 。
测试用例会保证可以构造出 有效 的二叉树。
示例1:
1 |
|
示例2:
1 |
|
提示:
1 <= descriptions.length <= 10^4
descriptions[i].length == 3
1 <= parenti, childi <= 10^5
0 <= isLefti <= 1
descriptions
所描述的二叉树是一棵有效二叉树
分析和解答
好像还是在周赛里第一次见到这种构建的题,这次想到的比较慢,以后应该想构建题就直接搞哈希表(mapping)
开始是一种超级暴力的思路,每次找一个节点,都去dfs一遍看看能不能插入,能插入就插入,不能插入就下一个
但实际上mapping后每个value都能找到对应的节点,这样插入的时候实际上就是把“地址”拼接在一起了;
两轮,第一轮存节点+直接建树,然后第二轮找root作为返回;
1 |
|