摘要:
原题(Medium): 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。 思路: 遍历数组时且逐元素相乘时,如果遇到了0,在求乘积最大值的情况下,0左边的元素与0右边的元素将不会产生任何联系,因为结果归零了。所以可以把数组看作是被0拆分的各个子数组,然后求其 阅读全文
摘要:
list就是链表的实现,链表是什么,我就不再解释了。list的好处就是每次插入或删除一个元素,都是常数的时空复杂度。但遍历或访问就需要O(n)的时间。 List本身其实不难理解,难点在于某些功能函数的实现上,例如我们会在最后讨论的迁移函数splice()、反转函数reverse()、排序函数sort 阅读全文
摘要:
原题(Medium): 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。 思路:自底向上(bottom-to-up)、归并排序(Merge Sort) 题目对时间复杂度和空间复杂度做出了要求,常用的对数级别的排序方法不多,由于这里并不是双向链表,所以快排不太可能,可以使用归 阅读全文
摘要:
原题(Medium): 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(k 阅读全文
摘要:
原题(Medium): 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 思路: 首先要考虑的 阅读全文
摘要:
原题(Medium): 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 思路:动态规划 这题有个陷阱,需要特别注意,就是非空字符串s的字母 阅读全文
摘要:
原题(Medium): 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 思路: 前序遍历,其数组的分布应为[根结点,左子树结点,右子树结点]。 中序遍历,其数组分布应为[左子树结点,根结点,右子树结点]。 那么,从前序遍历数组出发,第一个元素即为根结点的值,在中序 阅读全文
摘要:
原题(Medium): 给定一个二叉树,原地将它展开为链表。 根据题意,原地展开的意思是,按照中序遍历的顺序(中左右)把二叉树的结点逐一放到树的右节点上。 思路: 我们已经知道,展开为链表后各节点顺序就是二叉树中序遍历的顺序,那么于一个节点而言,展开后,原本在其左子树节点肯定在原本其右子树的前面,例 阅读全文
摘要:
本节要学的容器就是我们日常开发中使用最多的vector,vector的数据安排以及操作方式,与array非常相似。两者唯一的区别在于空间运用的灵活性。array是静态空间,配置了其大小就不能被改变,如果空间满了,要换大的,这只能自己手动来:配置新空间,将元素从旧址一一复制过去,再把原来的空间释放。而vector是动态空间,随着元素的加入,它内部会自行扩充空间,进行元素的复制并释放旧空间。所以在使用上,我们更趋向于使用vector而非array,因为不用考虑元素个数的问题,很适合动态元素个数的情况。我们不必因为害怕空间不足而一开始就要求一个大块头的array了。 阅读全文
摘要:
上节给出了iterator_traits以及用到traits机制的部分函数的完整代码,可以看到traits机制能够提取迭代器的特性从而调用不同的函数,实现效率的最大化。显然这么好的机制不应该仅局限于在STL里面使用,在前某一节中我们也有说到,traits机制能够萃取类的特性,而这个类分为两个类别,一 阅读全文