最长连续序列

给定一个未排序的整数数组,找出最长连续序列的长度。

说明

要求你的算法复杂度为O(n)

样例

给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4],返回所求长度 4

解题

排序后比较简单,快排O(nlogn)

后面只需要O(n)的时间复杂度求解了

发现原数组里面有重复数字的时候,下面方法行不通了。

public class Solution {
/**
* @param nums: A list of integers
* @return an integer
*/
public int longestConsecutive(int[] num) {
// write you code here
quickSort(num,0,num.length - 1);
int maxLen = 1;
int subLen = 1;
if(num.length ==4){
for(int i = 0;i< num.length;i++){
System.out.print(num[i] + "\t");
}
}
for(int i = 0;i<= num.length-2 ;i++){
if(num[i] + 1 ==num[i+1]){
subLen++;
}else{
subLen = 1; }
maxLen = Math.max(maxLen,subLen);
}
return maxLen;
} public void quickSort(int[] A,int low ,int high){
if(low>= high)
return;
int i = low;
int j = high;
int tmp = A[low];
while(i<j){
while(i<j && A[j] > tmp)
j--;
if(i<j){
A[i] = A[j];
i++;
} while(i<j && A[i]<= tmp)
i++;
if(i<j){
A[j] = A[i];
j--;
} }
A[i] = tmp;
quickSort(A,low,i-1);
quickSort(A,i+1,high);
}
}

稍作修改,对连续相等的说长度不变

public class Solution {
/**
* @param nums: A list of integers
* @return an integer
*/
public int longestConsecutive(int[] num) {
// write you code here
quickSort(num,0,num.length - 1);
int maxLen = 1;
int subLen = 1;
// if(num.length ==4){
// for(int i = 0;i< num.length;i++){
// System.out.print(num[i] + "\t");
// }
// }
for(int i = 0;i<= num.length-2 ;i++){
if(num[i] + 1 ==num[i+1]){
subLen++;
}else if(num[i]==num[i+1]){
// 相等的时候不做处理
}else{
subLen = 1; }
maxLen = Math.max(maxLen,subLen);
}
return maxLen;
} public void quickSort(int[] A,int low ,int high){
if(low <0 || high>A.length || low>= high)
return;
int i = low;
int j = high;
int tmp = A[low];
while(i<j){
while(i<j && A[j] > tmp)
j--;
if(i<j){
A[i] = A[j];
i++;
} while(i<j && A[i]<= tmp)
i++;
if(i<j){
A[j] = A[i];
j--;
} }
A[i] = tmp;
quickSort(A,low,i-1);
quickSort(A,i+1,high);
}
}

但是96% 数据通过测试时,出现了快排的栈溢出

这个数据量是一万,同时还是完全逆序,网上的解释就是快排数据量太多了。

programcreek 上的方法

定义一个集合,去除了重复数,在每个数两边找,判断是否连续

public class Solution {
/**
* @param nums: A list of integers
* @return an integer
*/
public int longestConsecutive(int[] num) {
// write you code here
if(num.length <= 1)
return num.length;
Set<Integer> set = new HashSet<Integer>();
for(int e:num)
set.add(e);
int max = 1;
for(int e:num){
int count = 1;
int left = e - 1;
int right = e + 1;
while(set.contains(left)){
count++;
set.remove(left);
left--;
}
while(set.contains(right)){
count++;
set.remove(right);
right++;
}
max = Math.max(max,count);
}
return max;
}
}

Python 集合更方便

class Solution:
"""
@param num, a list of integer
@return an integer
"""
def longestConsecutive(self, num):
# write your code here
s = set(num)
Max = 1
for e in num:
count = 1
left = e - 1
right = e + 1
while left in s:
count+=1
s.remove(left)
left -=1
while right in s:
count+=1
s.remove(right)
right+=1
Max = max(Max,count)
return Max

lintcode: 最长连续序列的更多相关文章

  1. [LintCode] 619 Binary Tree Longest Consecutive Sequence III 二叉树最长连续序列 III

    Given a k-ary tree, find the length of the longest consecutive sequence path. The path could be star ...

  2. [LeetCode] 298. Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

  3. [LeetCode] 549. Binary Tree Longest Consecutive Sequence II 二叉树最长连续序列之 II

    Given a binary tree, you need to find the length of Longest Consecutive Path in Binary Tree. Especia ...

  4. [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

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

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

  6. [LeetCode] Binary Tree Longest Consecutive Sequence II 二叉树最长连续序列之二

    Given a binary tree, you need to find the length of Longest Consecutive Path in Binary Tree. Especia ...

  7. [Swift]LeetCode128. 最长连续序列 | Longest Consecutive Sequence

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

  8. [Swift]LeetCode298. 二叉树最长连续序列 $ Binary Tree Longest Consecutive Sequence

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

  9. [leetcode-128] 最长连续序列

    给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, ...

随机推荐

  1. Awesome Swift

    Awesome Swift https://github.com/matteocrippa/awesome-swift A collaborative list of awesome Swift re ...

  2. Android编程: fragment组件、菜单和Intent组件

    学习内容:fragment组件.菜单和Intent组件 ====fragment组件====1.fragment是一种自我容纳,模块化的,嵌入在一个Activity里面的视图组件    可以在运行时动 ...

  3. C# 非独占延时函数 非Sleep

    在C#窗口程序中,如果在主线程里调用Sleep,在Sleep完成之前, 界面呈现出假死状态,不能响应任何操作! 下边实现的是非独占性延时函数,延时过时中界面仍可响应消息: public static ...

  4. (补)PSP三张表

    学生     司新红 日期  2014.3.14 教师  王建民 项目计划总结 编程 完善程序 测试程序 阅读书籍 日总计 周日 10:00-10:30 pm 0.5 周一 10:00-10:30 p ...

  5. ELK:kibana使用的lucene查询语法

    kibana在ELK阵营中用来查询展示数据elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 kibana4官方演示页面 全文搜索 在搜索栏输入login,会返回所有字段值 ...

  6. NYOJ-205 求余数 AC 分类: NYOJ 2014-02-02 12:30 201人阅读 评论(0) 收藏

    这题目看一眼以为难度评级出错了,只是一个求余数的题目,,后来才发现,位数小于百万位,,,我还以为是大小小于百万呢,所以借鉴了另一大神的代码, 用大数,重点是同余定理: (a+b)mod m=((a m ...

  7. AngularJs学习笔记--Forms

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/forms 控件(input.select.textarea)是用户输入数据的一种方式.Form(表单) ...

  8. Java正则表达式匹配例子

    Java正则表达式匹配例子 package com.ibm.test; import java.util.regex.Matcher; import java.util.regex.Pattern; ...

  9. D3D11 Debug Layer的bug

    在开发D3D应用程序时,我们会使用Debug Layer来调试应用程序,以确保我们的程序在最终发布时没有warnings和errors.不过最近在开发应用程序时遇到了这样的问题,就是我把多个网格模型的 ...

  10. ThinkPHP3.2 分页实现

    ThinkPHP 分页实现   TP3.2框架手册,有一个数据分页,不过每次都要写太多的代码,还有中文设置等有些麻烦,做为程序开发者,有必要整理下: O.先看效果图 一.分页方法 /** * TODO ...