1640. 能否连接形成数组
1 | class Solution { |
4ms,和最快的思路刚好相反,用map存储arr的index,最快的思路是反过来,用map存一个piece的第一个index
1 | class Solution { |
707. 设计链表
1 | struct List { |
1 | class Solution { |
4ms,和最快的思路刚好相反,用map存储arr的index,最快的思路是反过来,用map存一个piece的第一个index
1 | class Solution { |
1 | struct List { |
1 | class Solution { |
难,看懂解析思路后才写出来的
刚开始的思路是找0,把1分成了n段,取n/3 , 2n/3和 n段后面的0,然后向右移动双指针比较
后来发现有超级长的输入,超时了
解析的思路与我刚好相反,先数1的个数,如果是0或者不能被3整除,说明不能分成三段
1的个数为n,找到第0 n/3 2n/3个1,记为p1, p2, p3
p3到后末尾的长度就是三个子串的长度,如果p1 或 p2 + 字串长度分别大于p2 p3,说明无解
然后向后比较,若后面的数完全相同则有解
1 | class Solution { |
想法很简单,就是从左往右遍历,数当前遇到了几种水果,当遇到第三种水果后,更新一下装入水果的最大值,三种水果记录为typea, typeb, typec
然后回溯,找到前一个节点在左侧最后一个typea后第一次出现的位置(其实也是typea最后出现的位置的后两个位置)
1 | class Solution { |
LeetCode 524「通过删除字母匹配到字典里最长单词」
本文件实现 LeetCode 524「通过删除字母匹配到字典里最长单词」的一种预处理做法。目标是在字典中找出可以由字符串 s 删除若干字符得到的最长单词;若长度相同,返回字典序最小者。
代码先构建 f[i][c],表示从位置 i 开始往后字符 c 第一次出现的位置,不存在则为 m。匹配某个候选词时,只需按字符不断跳到下一个出现位置,如果任一字符不存在则匹配失败。这样可以把每个单词的匹配成本降为 O(单词长度),预处理为 O(26m)。文件中带有打印矩阵的调试输出和一个示例调用。
1 | from typing import List, Tuple, Dict |
1 | class Solution { |
想法很简单,就是从左往右遍历,数当前遇到了几种水果,当遇到第三种水果后,更新一下装入水果的最大值,三种水果记录为typea, typeb, typec
然后回溯,找到前一个节点在左侧最后一个typea后第一次出现的位置(其实也是typea最后出现的位置的后两个位置)
1 | class Solution { |
1 | class Solution { |
难,看懂解析思路后才写出来的
刚开始的思路是找0,把1分成了n段,取n/3 , 2n/3和 n段后面的0,然后向右移动双指针比较
后来发现有超级长的输入,超时了
解析的思路与我刚好相反,先数1的个数,如果是0或者不能被3整除,说明不能分成三段
1的个数为n,找到第0 n/3 2n/3个1,记为p1, p2, p3
p3到后末尾的长度就是三个子串的长度,如果p1 或 p2 + 字串长度分别大于p2 p3,说明无解
然后向后比较,若后面的数完全相同则有解
本文件实现 LeetCode 107「二叉树的层序遍历 II」。核心思路是先按普通层序遍历从上到下收集每一层节点值,再对结果整体反转,得到自底向上的层序结果。
实现中使用两个队列:s 保存当前层待访问节点,tmp_s 暂存下一层节点。当前层队列清空时,将本层结果写入 res,再把下一层队列转为当前层继续处理。最后通过 reverse(res.begin(), res.end()) 将层序结果倒置。时间复杂度为 O(n),每个节点访问一次;空间复杂度为 O(n),主要来自队列和结果数组。
1 | /** |
本文件实现 LeetCode 146「LRU 缓存」。目标是在固定容量下支持 get 和 put,并在容量满时淘汰最近最少使用的键。
代码使用 unordered_map<int, Node*> 做 key 到链表节点的映射,并用带哨兵节点 root 的双向循环链表维护访问顺序。链表头部表示最近使用,尾部表示最久未使用。get 命中后将节点移动到头部;put 已存在时更新值并移到头部,不存在且容量未满时插入新节点,容量已满时复用尾节点并更新映射。平均时间复杂度为 O(1),空间复杂度为 O(capacity)。
1 |
|
本文件实现 LeetCode 148「排序链表」。核心思路是对单链表做归并排序,利用链表切分和有序链表合并完成排序。
split 使用快慢指针找到链表中点,并断开为左右两段;sortList 递归排序左右子链表;merge 使用虚拟头节点把两个有序链表合并。归并排序适合链表结构,因为合并时只需要调整指针,不需要随机访问。时间复杂度为 O(n log n),递归栈空间复杂度为 O(log n)。
1 | /** |