128. 最長連續序列

給定一個未排序的整數數組,找出最長連續序列的長度。

要求算法的時間複雜度爲 O(n)

示例:

輸入: [100, 4, 200, 1, 3, 2]
輸出: 4
解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度爲 4。

解法一:

先來一個無腦ac的答案,該答案先進行排序,而類庫中的快速排序時間複雜度爲nlog(n),而題目要求的時間複雜度爲O(n),但也神奇的通過了。

class Solution {
    public int longestConsecutive(int[] nums) {
        int max=1;
        int left=0;
        int duplicates=0;
        int len=1;
        if(nums.length<1)
            return 0;
        if(nums.length==1)
            return 1;
        Arrays.sort(nums);
        for(int i=1;i<nums.length;i++){
            if(nums[i]==nums[i-1]){
              duplicates+=1;
              continue;
            }
            else if(nums[i]==nums[i-1]+1){
              continue;
            }else{
                max=Math.max(max,i-left-duplicates);
                left=i;
                duplicates=0;
            }
        }
        max=Math.max(max,nums.length-left-duplicates);
        return max;
    }
}

解法二:進行優化,一個非常常用的用來降低時間複雜度的做法就是用空間換時間。

用set或則hashmap的查找效率:

class Solution {
    public int longestConsecutive(int[] nums) {
       if(nums.length==0)
           return 0;
       if(nums.length==1)
           return 1;
       Set<Integer> set=new HashSet<>();
       for(Integer i:nums){
           set.add(i);
       }
       int max=0;
       for(int i:nums){           
           if(!set.contains(i-1)){
                 int cnt=0;
                 while(set.contains(i)){
                     cnt++;
                     i++;
                 }
                 max=max>cnt?max:cnt;
              }
       }
       return max;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章