๐Ÿ˜ต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ๅฑ…็„ถๆ˜ฏๆœ‰่ฟ”ๅ›žๅ€ผ็š„ๆˆ‘ๆƒŠไบ†

class Solution {
    public boolean sequenceReconstruction(int[] nums, List<List<Integer>> sequences) {
        Map<Integer, Set<Integer>> map = new HashMap<>();
        Map<Integer, Integer> indegrees = new HashMap<>();
        
        for (List<Integer> seq : sequences) {
            if (seq.size() == 1) {
                indegrees.put(seq.get(0), indegrees.getOrDefault(seq.get(0), 0));
                continue;
            }
            for (int i = 0; i < seq.size() - 1; i++) {
                Set<Integer> next = map.get(seq.get(i));
                if (next == null) {
                    next = new HashSet<>();
                }
                //่ฟ™้‡Œ็š„ifๅพˆ้‡่ฆ๏ผŒๅ› ไธบ็›ธๅŒ็š„้กบๅบๅฏ่ƒฝๅ‡บ็Žฐๅœจๅคšไธชarray้‡Œ๏ผŒๆฏ”ๅฆ‚ไธคไธชarray้ƒฝๆœ‰5 2
                //่ฟ™ๆ—ถๅ€™่ฆๅ…ˆๅˆคๆ–ญaddๆ˜ฏไธๆ˜ฏ็œŸ็š„ๆœ‰add๏ผŒๅฆๅˆ™ๅ…ฅๅบฆไผš้‡ๅค่ขซๅŠ 
                if (next.add(seq.get(i + 1))) {
                    map.put(seq.get(i), next);
                    indegrees.put(seq.get(i + 1), indegrees.getOrDefault(seq.get(i + 1), 0) + 1);
                }
                //่ฟ™ไธ€ๅฅๅพˆ้‡่ฆ ไธ็„ถๅ…ฅๅบฆไธบ0็š„็‚นๆฒกๆณ•่ขซๆ”พ่ฟ›queue้‡Œ
                indegrees.put(seq.get(i), indegrees.getOrDefault(seq.get(i), 0));
            }
        }
        
        Queue<Integer> queue = new ArrayDeque<>();
        for (Map.Entry<Integer, Integer> entry : indegrees.entrySet()) {
            if (entry.getValue() == 0) {
                queue.offer(entry.getKey());
            }
        }
        int index = 0;
        while (!queue.isEmpty()) {
            if (queue.size() > 1) {
                // System.out.println("return");
                return false;
            }
            int curr = queue.poll();
            // System.out.println(curr);
            index++;
            Set<Integer> next = map.get(curr);
            if (next == null) {
                continue;
            }
            for (int n : next) {
                // System.out.println(n);
                indegrees.put(n, indegrees.get(n) - 1);
                if (indegrees.get(n) == 0) {
                    queue.offer(n);
                }
            }
        }
        System.out.println(index);
        // ่ฟ™้‡Œ่ฟ˜ๆ˜ฏๅพˆๆœ‰ๅฟ…่ฆ็š„๏ผŒไธ‡ไธ€numsไธๆ˜ฏๆœ€็Ÿญๅ‘ข
        return index == nums.length;
    }
}

ไธ€ๅนดไน‹ๅŽๆ›ดๆ–ฐ๏ผŒ็”จarrayไปฃๆ›ฟmap๏ผŒๆ›ด็ฎ€ๅ•ๆ›ดไธๅฎนๆ˜“้”™

ๆณจๆ„้‚ฃไธช้š่—ๆกไปถ๏ผŒsubarrayไธญๆฒกๆœ‰้‡ๅคๅ…ƒ็ด ๏ผŒๆ‰€ไปฅไธ็”จ่€ƒ่™‘ไธ€ไธชๆ•ฐๆœ‰ไธคไธชset็š„ๆƒ…ๅ†ต

ไฝ†ๆ˜ฏ่ฆๆณจๆ„ๅฆ‚ๆžœset้‡Œๅทฒ็ปๆœ‰ๆŸไธชๆ•ฐไบ†indegreeๅฐฑไธ็”จๅ†ๅŠ ไบ†

class Solution {
    public boolean sequenceReconstruction(int[] nums, List<List<Integer>> sequences) {
        int n = nums.length;
        int[] indegrees = new int[n + 1];
        Map<Integer, Set<Integer>> map = new HashMap<>();
        for (List<Integer> seq : sequences) {
            for (int i = 1; i < seq.size(); i++) {
                Set<Integer> set = map.get(seq.get(i-1));
                if (set == null) {
                    set = new HashSet<>();
                }
                if (set.add(seq.get(i))) {
                    indegrees[seq.get(i)]++;
                }
                map.put(seq.get(i-1), set);
            }
        }
        Queue<Integer> queue = new ArrayDeque<>();
        for (int i = 1; i <= n; i++) {
            if (indegrees[i] == 0) {
                queue.offer(i);
            }
        }
        int cnt = 0;
        while (!queue.isEmpty()) {
            if (queue.size() != 1) {
                return false;
            }
            int num = queue.poll();
            if (nums[cnt++] != num) {
                return false;
            }
            Set<Integer> set = map.get(num);
            if (set != null) {
                for (int next : set) {
                    indegrees[next]--;
                    if (indegrees[next] == 0){
                        queue.offer(next);
                    }
                }
            }
        }
        return cnt == nums.length;
    }
}

Last updated