LeetCode Longest Consecutive Sequence
2015-01-15 22:06
260 查看
https://oj.leetcode.com/problems/longest-consecutive-sequence/
Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example,
Given
The longest consecutive elements sequence is
Your algorithm should run in O(n) complexity.
这个题是一个求最大连续序列长度的问题,是我做LeetCode题目以来自己解决的问题当中觉得最完美的,问题的时间复杂度要求是线性的,
我首先想到的是,开辟一个大数组可以包括最大值和最小值之间的所有数,然后求最大连续序列长度,首先这个数组的大小是无法控制的,很明显的超出了数组的范围,也超出了问题的空间限制。
其次想到的是,不储存第一个想法中的最小值和最大值之间的数,而是将原题中的数储存在一个哈希表中,然后依次遍历最小值和最大值之间的数,通过查找哈希表来确定该数有没有,从而得出最大连续序列长度,最后超时了。
最后想到的是,用两个哈希表,一个哈希表储存原题目中的数,然后依次遍历这些数,另一个哈希表储存已经遍历过得数防止重复计算,然后以这个数为基准左右扫描,求连续序列长度。负责度为O(N)。
代码如下:
Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example,
Given
[100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is
[1, 2, 3, 4]. Return its length:
4.
Your algorithm should run in O(n) complexity.
这个题是一个求最大连续序列长度的问题,是我做LeetCode题目以来自己解决的问题当中觉得最完美的,问题的时间复杂度要求是线性的,
我首先想到的是,开辟一个大数组可以包括最大值和最小值之间的所有数,然后求最大连续序列长度,首先这个数组的大小是无法控制的,很明显的超出了数组的范围,也超出了问题的空间限制。
其次想到的是,不储存第一个想法中的最小值和最大值之间的数,而是将原题中的数储存在一个哈希表中,然后依次遍历最小值和最大值之间的数,通过查找哈希表来确定该数有没有,从而得出最大连续序列长度,最后超时了。
最后想到的是,用两个哈希表,一个哈希表储存原题目中的数,然后依次遍历这些数,另一个哈希表储存已经遍历过得数防止重复计算,然后以这个数为基准左右扫描,求连续序列长度。负责度为O(N)。
代码如下:
public int longestConsecutive(int[] num) { if(num.length==0){ return 0; } int minvalue = Integer.MAX_VALUE; int maxvalue = Integer.MIN_VALUE; //储存原题目中的数 HashMap<Integer, Integer>numHashMap = new HashMap<Integer, Integer>(); //储存已经访问过得数 HashMap<Integer, Integer>visitedHashMap = new HashMap<Integer, Integer>(); for (int i = 0; i < num.length; i++) { if(minvalue>num[i]){ minvalue = num[i]; } if(maxvalue<num[i]){ maxvalue = num[i]; } numHashMap.put(num[i], num[i]); } int maxlength = 1; int length = 1; for(int i =0; i<num.length; i++){ //以num[i]为基准,求连续序列长度 if(visitedHashMap.get(num[i])==null){ visitedHashMap.put(num[i], num[i]); length = 1; int j=1; while(numHashMap.get(num[i]-j)!=null){ length++; visitedHashMap.put(num[i]-j, num[i]-j); j++; } j=1; while(numHashMap.get(num[i]+j)!=null){ length++; visitedHashMap.put(num[i]+j, num[i]+j); j++; } if(maxlength<length){ maxlength = length; } } } return maxlength; }
相关文章推荐
- [leetcode] 128. Longest Consecutive Sequence
- leetcode之Longest Consecutive Sequence
- LeetCode:Longest Consecutive Sequence
- LeetCode:Longest Consecutive Sequence
- [leetcode]longest consecutive sequence(java)
- [leetcode] 128.Longest Consecutive Sequence
- [LeetCode]Longest Consecutive Sequence
- [LeetCode] Longest Consecutive Sequence
- Leetcode-Longest Consecutive Sequence
- Leetcode: Longest Consecutive Sequence && Summary: Iterator用法以及ConcurrentModificationException错误说明
- leetcode Longest Consecutive Sequence
- [LeetCode] Longest Consecutive Sequence
- LeetCode "Binary Tree Longest Consecutive Sequence"
- leetcode 之Longest Consecutive Sequence(六)
- 【LeetCode】Longest Consecutive Sequence
- [LeetCode]Longest Consecutive Sequence
- [LeetCode][Java] Longest Consecutive Sequence
- LeetCode | Longest Consecutive Sequence(最长连续序列)
- LeetCode(12):longest-consecutive-sequence
- LeetCode: Longest Consecutive Sequence