😵444 sequence reconstruction

https://leetcode.com/problems/sequence-reconstruction/

答案源自网络,真的是我见过最傻逼的题目,其实意思就是给了一堆array构建一个super sequence,让所有array都是它的subseq,那么就要把array里的元素拿出来重新排列并保证它们在之前每个array里的相对顺序,所以用拓扑排序(保证相对顺序就考虑用拓扑排序)

这道题有个隐含条件是array里没有dup元素,同时给的seq已经是个super seq了所以不用判断

构建map的时候只需要和自己的下一个建立联系,后面顺序自然就成立了

如何判断sup seq有多个:某个时刻queue的size大于1,所谓shortest只是一个烟雾弹,拓扑排序出来的自然就是shortest

public class Solution {
    public boolean sequenceReconstruction(int[] org, int[][] seqs) {
        Map<Integer, Set<Integer>> map = new HashMap<>();
        Map<Integer, Integer> indegree = new HashMap<>();
        
        for(int[] seq: seqs) {
            if(seq.length == 1) {
                if(!map.containsKey(seq[0])) {
                    map.put(seq[0], new HashSet<>());
                    indegree.put(seq[0], 0);
                }
            } else {
                for(int i = 0; i < seq.length - 1; i++) {
                    if(!map.containsKey(seq[i])) {
                        map.put(seq[i], new HashSet<>());
                        indegree.put(seq[i], 0);
                    }

                    if(!map.containsKey(seq[i + 1])) {
                        map.put(seq[i + 1], new HashSet<>());
                        indegree.put(seq[i + 1], 0);
                    }

                    if(map.get(seq[i]).add(seq[i + 1])) {
                        indegree.put(seq[i + 1], indegree.get(seq[i + 1]) + 1);
                    }
                }
            }
        }

        Queue<Integer> queue = new LinkedList<>();
        for(Map.Entry<Integer, Integer> entry: indegree.entrySet()) {
            if(entry.getValue() == 0) queue.offer(entry.getKey());
        }

        int index = 0;
        while(!queue.isEmpty()) {
            int size = queue.size();
            if(size > 1) return false;
            int curr = queue.poll();
            if(index == org.length || curr != org[index++]) return false;
            for(int next: map.get(curr)) {
                indegree.put(next, indegree.get(next) - 1);
                if(indegree.get(next) == 0) queue.offer(next);
            }
        }
        return index == org.length && index == map.size();
    }
}

这是我的版本

拓扑排序要注意indegrees,要防止入度为0的没加上,或者入度重复加了,set的add居然是有返回值的我惊了

一年之后更新,用array代替map,更简单更不容易错

注意那个隐藏条件,subarray中没有重复元素,所以不用考虑一个数有两个set的情况

但是要注意如果set里已经有某个数了indegree就不用再加了

Last updated