摘要: 题目链接 解题思路:在链表上使用排序算法。注意,不能使用快排,因为快排的最差时间复杂度是O(n^2),数组形式的快排,以随机数划分能够得到O(n*logn),但是链表的形式,不太好以随机数的方式划分。所以最好的排序方法是使用归并排序。 先用快慢指针,将链表分成两部分,然后两部分分别归并排序,得到两个 阅读全文
posted @ 2024-12-27 17:15 ouyangxx 阅读(9) 评论(0) 推荐(0)
摘要: 题目链接 解题思路:用链表+哈希表。链表从头串到尾,淘汰时,从尾部开始淘汰。每次get时,如果找到了,则把这个节点移到头部。每次put,新建一个节点,放在头部,如果容量不够了,则淘汰尾部的数据。哈希表的作用是,能快速通过key找到链表中的节点。 代码 class LRUCache: class No 阅读全文
posted @ 2024-12-27 16:35 ouyangxx 阅读(17) 评论(0) 推荐(0)
摘要: 题目链接 解题思路:一个快指针,一个慢指针,如果二者相等了,说明有环。如果快指针为空了,说明没环 代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # s 阅读全文
posted @ 2024-12-27 15:35 ouyangxx 阅读(6) 评论(0) 推荐(0)
摘要: 题目链接 解题思路:和139题类似,只不过要把所有的结果存起来而已 代码 class Solution: def check(self, s: str, i: int, s2: str) -> int: if i + len(s2) > len(s): return -1 for ch in s2: 阅读全文
posted @ 2024-12-27 15:13 ouyangxx 阅读(8) 评论(0) 推荐(0)
摘要: 题目链接 解题思路:暴力递归+缓存,也就是自顶向下的动态规划。process(s, index, wordDict),s[index..]后面的能被wordDict拼出来吗?使用一个for循环,尝试wordDict中的所有单词。然后加一个缓存表,就可以了 代码 class Solution: # s 阅读全文
posted @ 2024-12-27 14:58 ouyangxx 阅读(19) 评论(0) 推荐(0)
摘要: 题目链接 解题思路:先拷贝新节点,新节点放在老节点后面。然后再遍历一遍,设置新节点的random指针。新节点的random,指向的是「老节点的random的下一个节点」。最后将新老节点分开即可。 代码 class Solution: def copyRandomList(self, head: 'O 阅读全文
posted @ 2024-12-27 14:36 ouyangxx 阅读(9) 评论(0) 推荐(0)
摘要: 题目链接 解题思路:只出现一次,其余的数全部两次,异或操作,其余两次的数异或之后,全部变成了0. 代码 class Solution: def singleNumber(self, nums: List[int]) -> int: return reduce(lambda x, y : x ^ y, 阅读全文
posted @ 2024-12-27 11:27 ouyangxx 阅读(12) 评论(0) 推荐(0)
摘要: 题目链接 解题思路:回溯,尝试每一种可能,process(s, i),划分s[i...],当前的回文子串有哪些情况?单独一个i,或者i, i+1,或者i, i+1, i+2,因此,用一个for循环解决。然后再检查[i, j]是否是回文子串,如果是,则继续递归,划分下一个回文子串process(s, 阅读全文
posted @ 2024-12-27 10:30 ouyangxx 阅读(9) 评论(0) 推荐(0)