做题总结

1.字符串问题

无重复字符的最长子串

我的做法:dp[i]表示以s[i]结尾的最长无重复字串,更新方程

if (i-dp[i-1], i-1)没有和dp[i]重复的元素,
	dp[i]=dp[i-1]+1
else dp[i] = i-samepos, samepos是从i向左数第一个和s[i]重复的元素

时间复杂度O(n^2),空间复杂度O(n)

更好的做法:滑动窗口
左右指针,左指针一次增加一个,右指针直接移动到最长不重复串,由于左指针移动是减少串长度,所以右指针总是递增的。时间复杂度O(N),空间复杂度O(1),只需要维护一个最多26个字母的unordered_set。

2.链表问题

反转链表

简单问题,分为递归做法和迭代。

3.数组问题

数组中的第K个最大元素

没思路,直接参考题解

基于快排的选择

实际问题

LRU 缓存

我的做法:用unordered_map存储映射,value存储成time_val形式的,在put和get操作时都更新timestamp。
存在的问题是:在put操作时检查最小时间戳需要O(n)时间,不符合要求。

实际做法:双向链表+哈希表
使用双向链表的原因:便于更新时间戳,为什么不用单向链表?因为删除尾部后无法找到上一个节点。
需要自己手动实现双向链表。

posted @ 2023-01-14 00:31  kenor  阅读(35)  评论(0)    收藏  举报