zoukankan      html  css  js  c++  java
  • 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.

    思路

    先对数组排序,然后用DP

     1 public class Solution {
     2     public int longestConsecutive(int[] num) {
     3         Arrays.sort(num);
     4         int curLength = 1;
     5         int maxLength = 1;
     6         
     7         for(int i = 1; i < num.length; i++){
     8             if(num[i] == num[i - 1])
     9                 continue;
    10             else if(num[i] - num[i - 1] == 1){
    11                 curLength ++;
    12                 maxLength = maxLength > curLength ? maxLength : curLength;
    13             }
    14             else
    15                 curLength = 1;
    16         }//for
    17         
    18         return maxLength;
    19     }
    20 }

     上面思路时间复杂度为O(N*logN)

    题目要求用O(n)这里可以借助hashtable或者hashmap,先将数组全部放到hash表中,在遍历数组,找到前面和后面的数,这里利用了hash通过get方法时间复杂度为o(1)

     1 import java.util.Hashtable;
     2 
     3 public class Solution {
     4     public int longestConsecutive(int[] num) {
     5         Hashtable<Integer, Integer> map = new Hashtable<Integer, Integer>();
     6         for(int i = 0; i < num.length; i++){
     7             map.put(num[i], 1);
     8         }//放到hash表中
     9         
    10         int result = 0;
    11         for(int i = 0; i < num.length; i++){
    12             int sum = 1;
    13             if(map.get(num[i]) != null){
    14                 int left = num[i] - 1;
    15                 map.remove(num[i]);
    16                 while(map.get(left) != null){
    17                     sum ++;
    18                     map.remove(left);
    19                     left--;
    20                 }//while
    21                 int right = num[i] + 1;
    22                 while(map.get(right) != null){
    23                     sum++;
    24                     map.remove(right);
    25                     right++;
    26                 }//while
    27                 
    28                 result = result > sum ? result : sum;
    29             }//if
    30         }//for
    31         
    32         return result;
    33     }
    34 }
  • 相关阅读:
    tomcat最大线程数的设置(转)
    webService接口大全
    实用工具网站汇总
    Linux常用指令(待补充)
    svn的使用总结(待补充)
    养生
    nodejs知识结构
    NVM node版本管理工具的安装和使用
    MongoDB安装和MongoChef可视化管理工具的使用
    JavaScript模块化编程(三)
  • 原文地址:https://www.cnblogs.com/luckygxf/p/4248340.html
Copyright © 2011-2022 走看看