๐ต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