码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode: Longest Consecutive Sequence 解题报告

时间:2014-10-26 11:40:45      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   java   for   

Longest Consecutive Sequence

bubuko.com,布布扣
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.

SOLUTION1:

用HashMap来空间换时间.

1. 在map中创建一些集合来表示连续的空间。比如,如果有[3,4,5]这样的一个集合,我们表示为key:3, value:5和key:5, value3两个集合,并且把这2个放在hashmap中。这样我们可以在O(1)的时间查询某个数字开头和结尾的集合。

2. 来了一个新的数字时,比如:N=6,我们可以搜索以N-1结尾 以N+1开头的集合有没有存在。从1中可以看到,key:5是存在的,这样我们可以删除3,5和5,3这两个key-value对,同样我们要查以7起头的集合有没有存在,同样可以删除以7起始的集合。删除后我们可以更新left,right的值,也就是合并和扩大集合。

3. 合并以上这些集合,创建一个以新的left,right作为开头,结尾的集合,分别以left, right作为key存储在map中。并且更新max (表示最长连续集合)

bubuko.com,布布扣
 1 public class Solution {
 2     public int longestConsecutive(int[] num) {
 3         if (num == null) {
 4             return 0;
 5         }
 6         
 7         HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
 8         
 9         int max = 0;
10         
11         int len = num.length;
12         for (int i = 0; i < len ; i++) {
13             // 寻找以num[i] 起头或是结尾的,如果找到,则可以跳过,因为我们
14             // 不需要重复的数字
15             if (map.get(num[i]) != null) {
16                 continue;
17             }
18             
19             int left = num[i];
20             int right = num[i];
21             
22             // 寻找左边界
23             Integer board = map.get(num[i] - 1);
24             if (board != null && board < left) {
25                 // 更新左边界
26                 left = board;
27                 
28                 // 删除左边2个集合
29                 map.remove(left);
30                 map.remove(num[i] - 1);
31             }
32             
33             // 寻找右边界
34             board = map.get(num[i] + 1);
35             if (board != null && board > right) {
36                 // 更新右边界
37                 right = board;
38                 
39                 // 删除右边2个集合
40                 map.remove(right);
41                 map.remove(num[i] + 1);
42             }
43             
44             // 创建新的合并之后的集合
45             map.put(left, right);
46             map.put(right, left);
47             
48             max = Math.max(max, right - left + 1);
49         }
50         
51         return max;
52     }
53 }
View Code

GITHUB:

LongestConsecutive.java

LeetCode: Longest Consecutive Sequence 解题报告

标签:style   blog   http   color   io   os   ar   java   for   

原文地址:http://www.cnblogs.com/yuzhangcmu/p/4051775.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!