1、题目
2、题解
读完题目后的第一个想法就是对数组排序,排序后对数组进行一次遍历找到其中的连续序列即可,但已知的排序算法时间复杂度都不能保证O(n)
算法 | 最好时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 空间复杂度 |
快速排序 | O(nlog2(n)) | O(n2) | O(nlog2(n)) | O(log2n) |
归并排序 | O(nlog2(n)) | O(nlog2(n)) | O(nlog2(n) | O(n) |
堆排序 | O(nlog2(n)) | O(nlog2(n)) | O(nlog2(n)) | O(1) |
冒泡排序 | O(n) | O(n2) | O(n2) | O(1) |
选择排序 | O(n2) | O(n2) | O(n2) | O(1) |
插入排序 | O(n) | O(n2) | O(n2) | O(1) |
思考新的思路,纠结于O(n)的时间复杂度,忽略了O(n)的复杂度不是只能遍历一遍数组,而是不能嵌套地遍历数组。由于go不像其它语言可以直接判断元素是否在数组内,所以构造了一个哈希表map,用来标识数组是否包含某一数字,实现代码如下
func longestConsecutive(nums []int) int {
ans:=0
isAt:=map[int]bool{}
for _, v := range nums { isAt[v]=true }
for _, v := range nums {
if isAt[v-1] {
continue
} else {
t:=v+1
for isAt[t] { t++ }
if ans<(t-v) { ans=t-v }
}
}
return ans
}
提交结果如下,运行时间依旧不太行
考虑提高时间效率的方法,结合题解,发现nums数组中很有可能存在重复的数字,所以第二轮遍历针对的对象不再是nums数组,而是存放数字存在与否信息的哈希表,最后提交结果如下,时间显著提升。