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){
            
        }
    }
    
  • 相关阅读:
    vim在插入模式下的粘贴
    关于外语学习的7个“美丽误会”(图)
    美国在线教育的启示:教育领域正在革命
    自动生成计算题
    字符串的截取,分割,替换
    将字符串转成byte,然后再转回来 日期相互转化字符串
    java编写的万年历代码
    小球弹砖块游戏(JAVA)
    随即输入一段字符串,统计出数字,大写字母。小写字母,空格
    邮箱验证信息
  • 原文地址:https://www.cnblogs.com/sidewinder/p/13746476.html
Copyright © 2011-2022 走看看