九章算法官网-原文网址
http://www.jiuzhang.com/problem/27/
题目
给一个整数集合S,定义S的子集D为连续子集当且仅当D中的整数构成连续的整数序列。求S的最大连续子集,即包含连续整数最多的子集。如{1, 3, 4, 100, 200, 2}的最大连续子集为{1,2,3,4}
解答
下面给出一个时空复杂度都是O(n)的方法:使用Hash表,索引当前找到的所有连续子集。对于每个集合,索引{第一个数: 集合}和{最后一个数: 集合},如:{1: {1, 2, 3}, 3: {1, 2, 3}, 5: {5, 6}, 6: {5, 6}} 。遍历S的时候,假设遍历到数k,检查k-1为最后一个数和k+1为第一个数的集合在Hash表中是否存在,如果存在则和k一起合并为一个大的集合,删除之前的集合,并加入新的集合。这样每一次操作时间复杂度是O(1)的。最后找到Hash表中最大的集合输出即可。
面试官角度
这个题目的考点是Hash表。首先你可以答一个简单的排序的方法,复杂度是O(nlogn),这时候面试官会提示是否有更好的方法,于是要去想O(n)的方法。那么自然也就是需要考虑到S集合只能遍历一次。考虑使用一些O(1)复杂度的数据结构来加速运算,则想到Hash表。进而想到对于已经找到的集合,在Hash表中存储左右边界。