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.

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 (表示最长连续集合)

 public class Solution {
public int longestConsecutive(int[] num) {
if (num == null) {
return 0;
} HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); int max = 0; int len = num.length;
for (int i = 0; i < len ; i++) {
// 寻找以num[i] 起头或是结尾的,如果找到,则可以跳过,因为我们
// 不需要重复的数字
if (map.get(num[i]) != null) {
continue;
} int left = num[i];
int right = num[i]; // 寻找左边界
Integer board = map.get(num[i] - 1);
if (board != null && board < left) {
// 更新左边界
left = board; // 删除左边2个集合
map.remove(left);
map.remove(num[i] - 1);
} // 寻找右边界
board = map.get(num[i] + 1);
if (board != null && board > right) {
// 更新右边界
right = board; // 删除右边2个集合
map.remove(right);
map.remove(num[i] + 1);
} // 创建新的合并之后的集合
map.put(left, right);
map.put(right, left); max = Math.max(max, right - left + 1);
} return max;
}
}

SOLUTION2:

引自大神的解法:http://blog.csdn.net/fightforyourdream/article/details/15024861

我们可以把所有的数字放在hashset中,来一个数字后,取出HashSet中的某一元素x,找x-1,x-2....x+1,x+2...是否也在set里。

 // solution 2: use hashset.
public int longestConsecutive(int[] num) {
if (num == null) {
return 0;
} HashSet<Integer> set = new HashSet<Integer>();
for (int i: num) {
set.add(i);
} int max = 0;
for (int i: num) {
int cnt = 1;
set.remove(i); int tmp = i - 1;
while (set.contains(tmp)) {
set.remove(tmp);
cnt++;
tmp--;
} tmp = i + 1;
while (set.contains(tmp)) {
set.remove(tmp);
cnt++;
tmp++;
} max = Math.max(max, cnt);
} return max;
}

2015.1.2 redo:

 public class Solution {
public int longestConsecutive(int[] num) {
if (num == null) {
return 0;
} HashSet<Integer> set = new HashSet<Integer>();
for (int i: num) {
set.add(i);
} int max = 0; for (int i: num) {
set.remove(i);
int sum = 1; int tmp = i - 1;
while (set.contains(tmp)) {
// bug 1:forget to add the remove statement.
set.remove(tmp);
sum++;
tmp--;
} tmp = i + 1;
while (set.contains(tmp)) {
set.remove(tmp);
sum++;
tmp++;
} max = Math.max(max, sum);
} return max;
}
}

GITHUB:

LongestConsecutive.java

LeetCode: Longest Consecutive Sequence 解题报告的更多相关文章

  1. [LeetCode] 128. Longest Consecutive Sequence 解题思路

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  2. LeetCode——Longest Consecutive Sequence

    LeetCode--Longest Consecutive Sequence Question Given an unsorted array of integers, find the length ...

  3. [LeetCode] Longest Consecutive Sequence 求最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  4. [leetcode]Longest Consecutive Sequence @ Python

    原题地址:https://oj.leetcode.com/problems/longest-consecutive-sequence/ 题意: Given an unsorted array of i ...

  5. [LeetCode] Longest Consecutive Sequence

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  6. LeetCode: Longest Consecutive Sequence [128]

    [题目] Given an unsorted array of integers, find the length of the longest consecutive elements sequen ...

  7. Leetcode: Longest Consecutive Sequence && Summary: Iterator用法以及ConcurrentModificationException错误说明

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  8. LeetCode—Longest Consecutive Sequence

    题目描述: Given an unsorted array of integers, find the length of the longest consecutive elements seque ...

  9. [Leetcode] Longest consecutive sequence 最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

随机推荐

  1. with/as上下文管理器

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python学习手册 868 #with/as上下文管理器 #with语句的基本格式: with open( ...

  2. html5实现全屏的api方法

    参考地址 [进入和退出全屏] // Webkit (works in Safari5.1 and Chrome 15) element.webkitRequestFullScreen(); docum ...

  3. java多线程(一)之继承Thread类

    一.概述 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 二.两种实现方式, 下面为第一种方式: 继承Thread类 ...

  4. 关于远程访问Oracle数据库的设置(共享数据库)

    写在前面: 需求描述:     我笔记本上安装了oracle数据库, 现在同事也想连接这个数据库. 也就是设置为别人能远程访问我本地的数据库. 思路:     通过在我笔记本WiFi共享,别人连接该W ...

  5. HDUOJ----1114(多重背包)悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  6. Pycharm中 import 引入同级文件失败问题

    Pycharm中 import 引入同级文件失败,如下所示:  “This inspection detects names that should resolve but don't. Due to ...

  7. WordPress网站搬家全过程 亲身体验WordPress搬家,总结几点

    需要移动的文件主要是网站文件和数据库文件,如果是简单的wordpress   操作就是:备份网站文件,导出数据库文件,上传网站文件,导入数据库文件,移动网站文件,修改wordpress的wp-conf ...

  8. WinDBG 常用命令表[转]

    启动, 附加进程, 执行和退出(Starting, Attaching, Executing and Exiting) =======================   Start -> Al ...

  9. DBA_实践指南系列6_Oracle Erp R12工作流通知邮件配置Email(案例)

    2013-12-06 Created By BaoXinjian

  10. Posix共享内存区

    1.概述 Posix提供了两种在无亲缘关系进程间共享内存区的方法: (1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇笔记所用到的就 ...