题目
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)
。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
估计首先想到的都是排序吧,但是时间复杂度是O(nlogn)
。那么想到的只有Hash
了,这题HashMap
、HashSet
都有解法。
HashSet解法
- 首先将所有元素放入
HashSet
,使查询时间变为O(1)
; - 遍历数组,对每个元素,向左和向右扩展(查询是否在
HashSet
里面,若在则删除,避免相同连续序列的重复计算),计算扩展的长度,更新最长连续序列的值。
class Solution {
// public static List<Integer> asList(final int[] is)
// {
// return new AbstractList<Integer>() {
// public Integer get(int i) { return is[i]; }
// public int size() { return is.length; }
// };
// }
public int longestConsecutive(int[] nums) {
int maxLen = 0;
Set<Integer> set = new HashSet<>();
for (int i = 0; i< nums.length; i++) set.add(nums[i]);
// set.addAll(asList(nums));
for (int i = 0; i < nums.length; i++) {
if (set.contains(nums[i])) {
int left = nums[i] - 1;
int right = nums[i] +