博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode: Longest Consecutive Sequence 解题报告
阅读量:6610 次
发布时间:2019-06-24

本文共 4247 字,大约阅读时间需要 14 分钟。

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

1 public class Solution { 2     public int longestConsecutive(int[] num) { 3         if (num == null) { 4             return 0; 5         } 6          7         HashMap
map = new HashMap
(); 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

 

SOLUTION2:

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

1 // solution 2: use hashset. 2     public int longestConsecutive(int[] num) { 3         if (num == null) { 4             return 0; 5         } 6          7         HashSet
set = new HashSet
(); 8 for (int i: num) { 9 set.add(i);10 }11 12 int max = 0;13 for (int i: num) {14 int cnt = 1;15 set.remove(i);16 17 int tmp = i - 1;18 while (set.contains(tmp)) {19 set.remove(tmp);20 cnt++;21 tmp--;22 }23 24 tmp = i + 1;25 while (set.contains(tmp)) {26 set.remove(tmp);27 cnt++;28 tmp++;29 }30 31 max = Math.max(max, cnt);32 }33 34 return max;35 }
View Code

 2015.1.2 redo:

1 public class Solution { 2     public int longestConsecutive(int[] num) { 3         if (num == null) { 4             return 0; 5         } 6          7         HashSet
set = new HashSet
(); 8 for (int i: num) { 9 set.add(i);10 }11 12 int max = 0;13 14 for (int i: num) {15 set.remove(i);16 int sum = 1;17 18 int tmp = i - 1;19 while (set.contains(tmp)) {20 // bug 1:forget to add the remove statement.21 set.remove(tmp);22 sum++;23 tmp--;24 }25 26 tmp = i + 1;27 while (set.contains(tmp)) {28 set.remove(tmp);29 sum++;30 tmp++;31 }32 33 max = Math.max(max, sum);34 }35 36 return max;37 }38 }
View Code

 

GITHUB:

转载地址:http://vmiso.baihongyu.com/

你可能感兴趣的文章
svs 在创建的时候 上传文件夹 bin obj 这些不要提交
查看>>
Tinkphp
查看>>
How to temporally disable IDE tools (load manually)
查看>>
Vue.js学习 Item4 -- 数据双向绑定
查看>>
几种排序方式的java实现(01:插入排序,冒泡排序,选择排序,快速排序)
查看>>
图片存储类型的种类、特点、区别
查看>>
GETTING UP AND RUNNING WITH NODE.JS, EXPRESS, JADE, AND MONGODB
查看>>
MySQLs数据库建外键时自动跑到缩影处,真奇怪
查看>>
static关键字
查看>>
js 合并多个对象 Object.assign
查看>>
Java 反射机制
查看>>
temporary Object and destructor
查看>>
xcode - 移动手势
查看>>
细说浏览器特性检测(1)-jQuery1.4添加部分
查看>>
古中国数学家的计算力真是惊人
查看>>
Java基础-算术运算符(Arithmetic Operators)
查看>>
C#编程(四十七)----------集合接口和类型
查看>>
【转】关于大型网站技术演进的思考(十二)--网站静态化处理—缓存(4)
查看>>
积跬步,聚小流------Bootstrap学习记录(1)
查看>>
HDUPhysical Examination(贪心)
查看>>