最长连续序列

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

说明

要求你的算法复杂度为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. angularJS项目-ajax事件的按钮loading和页面loading状态 & Controller之间通信-待续

    1).按钮loading --TODO 2). page loading状态 1.在module中注入指令 // Route State Load Spinner(used on page or co ...

  2. 设置浮点数的显示精度&precision(0)

    /*    设置浮点数的显示精度    cout.precision(int)可以设置浮点数的显示精度(不包括小数点)        注: 1.如果设置的精度大于浮点数的位数,如果浮点数能根据IEEE ...

  3. ERP系统实施与企业内部控制管理实践

    COSO内部控制体系包含5 个要素,分别为控制环境.风险评估.控制活动.信息与沟通.监督,涉及公司层面的控制.业务活动的控制以及信息系统总体控制.随着ERP系统的上线运行,企业的内部控制体系建设应与E ...

  4. (补)PSP三张表

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

  5. 动态生成C# Lambda表达式

    转载:http://www.educity.cn/develop/1407905.html,并整理! 对于C# Lambda的理解我们在之前的文章中已经讲述过了,那么作为Delegate的进化使用,为 ...

  6. MyEclipse构建WebService案例

    Hi,大家好! 今天主要和大家分享,如何搭建一个Web服务,做Android开发,不可避免会涉及到客户端开发,我们怎么样来实现一个服务端,怎么样来实现一个客户端,并相互传递数据.就算调用别人的服务时, ...

  7. httphelp web自动化

    public class HttpHelper    {        public static CookieContainer CookieContainers = new CookieConta ...

  8. 基于ArcEngine的空间数据通用建库软件介绍

    最近花了点时间把之前的空间数据入库功能进行了完善,在这里做一个简单的介绍,也希望大家给提点意见和建议,我的目标是做一个好用.易用.通用.稳定的入库程序. 1.软件特点: 基于模板(方案)的数据更新   ...

  9. 【转载】CreateProcess的用法

    第一.第二个参数的用法: 例子: 使用ie打开指定的网页. 注意第二个参数是 可执行文件+命令行参数 #include "stdafx.h" #include <window ...

  10. 6 高级IO函数

    6.1 pipe函数 pipe函数创建一个管道,用于实现进程间通信 #include<unistd.h> ]); 参数包含两个文件描述符fd[0]和fd[1],往fd[1]写入的数据可以从 ...