zoukankan      html  css  js  c++  java
  • 最长的连续序列的长度

    题目描述
    给定无序数组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){
            
        }
    }
    
  • 相关阅读:
    SDU暑期集训排位(8)
    hdu1423 最长公共上升子序列
    poj2385 Apple Catching (线性dp)
    hdu5857 Median(模拟)
    hdu5858 Hard problem(求两圆相交面积)
    shuoj 1 + 2 = 3? (二分+数位dp)
    Codeforces Round #460 (Div. 2) B Perfect Number(二分+数位dp)
    hdu4734 F(x)(数位dp)
    hdu3709 Balanced Number (数位dp)
    hdu3652 B-number(数位dp)
  • 原文地址:https://www.cnblogs.com/sidewinder/p/13746476.html
Copyright © 2011-2022 走看看