题解 | 数组中的最长连续子序列

数组中的最长连续子序列

https://www.nowcoder.com/practice/eac1c953170243338f941959146ac4bf

import java.util.*;

/**
 * NC95 数组中的最长连续子序列
 * @author d3y1
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * max increasing subsequence
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int MLS (int[] arr) {
        // return solution1(arr);
        // return solution2(arr);
        // return solution3(arr);
        // return solution4(arr);
        return solution5(arr);
    }

    /**
     * 小根堆
     * @param arr
     * @return
     */
    private int solution1(int[] arr){
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        for(int num: arr){
            minHeap.offer(num);
        }

        int result = 0;
        int len = 1;
        int pre = minHeap.poll();
        int cur;
        while(!minHeap.isEmpty()){
            cur = minHeap.poll();
            if(cur == pre){
                continue;
            }
            else if(cur == pre+1){
                len++;
                result = Math.max(result, len);
                pre = cur;
            }
            else{
                len = 1;
                pre = cur;
            }
        }

        return result;
    }

    /**
     * 排序
     * @param arr
     * @return
     */
    private int solution2(int[] arr){
        int n = arr.length;
        Arrays.sort(arr);

        int result = 0;
        int len = 1;
        for(int i=0; i+1<n; i++){
            if(arr[i+1] == arr[i]){
                continue;
            }
            else if(arr[i+1] == arr[i]+1){
                len++;
                result = Math.max(result, len);
            }
            else{
                len = 1;
            }
        }

        return result;
    }

    /**
     * HashSet
     * @param arr
     * @return
     */
    private int solution3(int[] arr){
        HashSet<Integer> set = new HashSet<>();

        for(int num: arr){
            set.add(num);
        }

        int result = 0;
        int len;
        for(int num: arr){
            if(set.contains(num-1)){
                continue;
            }

            int start = num;
            len = 1;
            while(set.contains(++start)){
                len++;
            }

            result = Math.max(result, len);
        }

        return result;
    }

    /**
     * HashMap
     * @param arr
     * @return
     */
    private int solution4(int[] arr){
        HashMap<Integer, Integer> map = new HashMap<>();

        int result = 0;
        int leftLen,rightLen,curLen;
        for(int num: arr){
            if(!map.containsKey(num)){
                leftLen = map.getOrDefault(num-1, 0);
                rightLen = map.getOrDefault(num+1, 0);
                curLen = leftLen+1+rightLen;
                map.put(num, curLen);
                result = Math.max(result, curLen);
                map.put(num-leftLen, curLen);
                map.put(num+rightLen, curLen);
            }
        }

        return result;
    }

    /**
     * 并查集
     * @param arr
     * @return
     */
    private int solution5(int[] arr){
        UnionFind uf = new UnionFind(arr);

        HashSet<Integer> set = new HashSet<>();
        for(int num: arr){
            set.add(num);
        }

        for(int num: arr){
            if(set.contains(num-1)){
                uf.union(num, num-1);
            }
        }

        return uf.maxSize();
    }

    private class UnionFind {
        int size;
        HashMap<Integer, Integer> parent = new HashMap<>();
        HashMap<Integer, Integer> sizeMap = new HashMap<>();

        UnionFind(int[] nums){
            this.size = 0;
            for(int num: nums){
                parent.put(num, num);
                sizeMap.put(num, 1);
            }
        }

        int find(int x){
            int par = parent.get(x);
            while(x != par){
                parent.put(x, parent.get(par));
                x = par;
                par = parent.get(x);
            }

            return x;
        }

        void union(int p, int q){
            int rootP = find(p);
            int rootQ = find(q);
            if(rootP != rootQ){
                int unionSize = sizeMap.get(rootP)+sizeMap.get(rootQ);
                if(rootP < rootQ){
                    parent.put(rootP, rootQ);
                    sizeMap.put(rootQ, unionSize);
                }else{
                    parent.put(rootQ, rootP);
                    sizeMap.put(rootP, unionSize);
                }
                this.size = Math.max(size, unionSize);
            }
        }

        int maxSize(){
            return this.size;
        }
    }
}

全部评论

相关推荐

01-14 19:01
吉首大学 Java
黑皮白袜臭脚体育生:加个项目吧,一般需要两个项目一业务一轮子呢,简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能指标来写
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务