Loading

最长的连续序列的长度

题目描述
给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)

解法一: 排序法


import java.util.*;


public class Solution {
    /**
     * max increasing subsequence
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int MLS (int[] arr) {
        // write code here
        Arrays.sort(arr);
        // 表示i结尾最长上升子序列
        int[] dp = new int[arr.length];
        dp[0] = 1;
        int maxValue = Integer.MIN_VALUE;
        for(int i = 1; i < arr.length; i++){
            if(arr[i] == arr[i-1]){
                dp[i] = dp[i-1];
            } else if(arr[i] == arr[i-1] + 1){
                dp[i] = dp[i-1] + 1;
            } else {
                dp[i] = 1;
            }
            maxValue = Math.max(maxValue, dp[i]);
        }
        return maxValue;
    }
}


使用TreeSet来做

import java.util.*;


public class Solution {
    /**
     * max increasing subsequence
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int MLS2(int[] arr) {
        // write code here
        Arrays.sort(arr);
        // 表示i结尾最长上升子序列
        int[] dp = new int[arr.length];
        dp[0] = 1;
        int maxValue = Integer.MIN_VALUE;
        for(int i = 1; i < arr.length; i++){
            if(arr[i] == arr[i-1]){
                dp[i] = dp[i-1];
            } else if(arr[i] == arr[i-1] + 1){
                dp[i] = dp[i-1] + 1;
            } else {
                dp[i] = 1;
            }
            maxValue = Math.max(maxValue, dp[i]);
        }
        return maxValue;
    }

    public int MLS (int[] arr) {
        TreeSet<Integer> set =new TreeSet<> ();
        // -------------------------------
        for(int i = 0; i < arr.length; i++){
            set.add(arr[i]);
        }
        // 类似的思路使用双指针;
        // 第一个指针指向第一个,第二个指针指向第二个
        Iterator<Integer> it = set.iterator();
        int cnt = 1;
        int maxCnt = 1;
        int prev = it.next();
        
        while(it.hasNext()){
            int value = it.next();
            if(value == prev)
                continue;
            else if(value == prev + 1){
                cnt ++;
                maxCnt = Math.max(cnt, maxCnt);
            } else{
                
                cnt = 1;
            }
            
            prev = value;
        }
        return maxCnt;
    }
}

可以使用并查集做,没有写完。

class UnionSet{
    int[] fa = new int[100000];
    int[] rank = new int[100000];
    
    UnionSet(int[] arr){
        
        
    }
    
    int find(int k){
        return fa[k] == k ? k : (fa[k] = find(fa[k]));
    }
    int merge(int x, int y){
        
    }
}
posted @ 2020-09-28 19:35  Sidewinder  阅读(446)  评论(0编辑  收藏  举报