สมมติว่าเราต้องตรวจสอบว่า org ของซีเควนซ์ดั้งเดิมนั้นสามารถสร้างขึ้นมาใหม่อย่างเฉพาะตัวจากซีเควนซ์ใน seqs ได้หรือไม่ ลำดับเดิมคือการเรียงสับเปลี่ยนของจำนวนเต็มตั้งแต่ 1 ถึง n และ n ในช่วง 1 ≤ n ≤ 10^4 ในที่นี้ การสร้างใหม่หมายถึงการสร้างลำดับลำดับที่สั้นที่สุดในลำดับ เราต้องตรวจสอบว่ามีลำดับเดียวเท่านั้นที่สามารถสร้างใหม่จาก seqs ได้หรือไม่และเป็นลำดับดั้งเดิม
ดังนั้น หากอินพุตเป็นเหมือน org =[1,2,3], seqs =[[1,2],[1,3]] ผลลัพธ์จะเป็นเท็จ เพราะ [1,2,3] ไม่ใช่ ลำดับเดียวเท่านั้นที่สามารถสร้างใหม่ได้ เนื่องจาก [1,3,2] เป็นลำดับที่ถูกต้องที่สร้างใหม่ได้
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน ok() ซึ่งจะใช้เวลา v1, v2,
-
ถ้าขนาดของ v1 ไม่เท่ากับขนาดของ v2 ดังนั้น −
-
คืนค่าเท็จ
-
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาด v1 อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
ถ้า v1[i] ไม่เท่ากับ v2[i] ดังนั้น −
-
คืนค่าเท็จ
-
-
-
คืนความจริง
-
จากวิธีหลักให้ทำดังนี้
-
n :=ขนาดของลำดับดั้งเดิม
-
กำหนดกราฟขนาดอาร์เรย์ (n + 1)
-
กำหนดหนึ่งแผนที่ในองศา
-
idx :=0
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของ seqs ให้อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
ถ้าขนาดของ seqs[i]>=1 และ (seqs[i, 0]> n หรือ seqs[i, 0] <1) แล้ว −
-
คืนค่าเท็จ
-
-
ถ้าขนาดของ seqs[i]>=1 และไม่นับจำนวนการเรียก (seqs[i, 0]) ของ indegree ดังนั้น −
-
indegree[seqs[i, 0]] :=0
-
-
สำหรับการเริ่มต้น j :=1 เมื่อ j <ขนาดของ seqs[i] อัปเดต (เพิ่ม j โดย 1) ให้ทำ -
-
u :=seqs[i, j - 1]
-
v :=seqs[i, j]
-
แทรก v ที่ส่วนท้ายของกราฟ[u]
-
(เพิ่มขึ้น indegree[v] โดย 1)
-
ถ้า u> n หรือ v> n หรือ u <1 หรือ v <1 แล้ว −
-
คืนค่าเท็จ
-
-
-
-
กำหนดหนึ่งคิว
-
สำหรับการเริ่มต้น i :=1 เมื่อฉัน <=n อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
ถ้าฉันอยู่ใน indegree และ indegree[i] เท่ากับ 0 แล้ว −
-
แทรก i ลงใน q
-
-
-
ในขณะที่ (ไม่ใช่ q ว่างเปล่า) ทำ -
-
ถ้าขนาดของ q> 1 แล้ว −
-
คืนค่าเท็จ
-
-
ถ้า idx เท่ากับขนาดของ org แล้ว −
-
คืนค่าเท็จ
-
-
โหนด :=องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
หาก org[idx] ไม่เท่ากับโหนด ดังนั้น −
-
คืนค่าเท็จ
-
-
(เพิ่ม idx ขึ้น 1)
-
สำหรับการเริ่มต้น i :=0 เมื่อฉัน <ขนาดของกราฟ[โหนด] อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
v :=กราฟ[โหนด ผม]
-
(ลดลง indegree[v] โดย 1)
-
ถ้า indegree[v] เท่ากับ 0 แล้ว −
-
แทรก v ลงใน q
-
-
-
-
คืนค่า true เมื่อ idx เท่ากับขนาดของ org
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: bool ok(vector <int<& v1, vector <int<& v2){ if (v1.size() != v2.size()) return false; for (int i = 0; i < v1.size(); i++) { if (v1[i] != v2[i]) return false; } return true; } bool sequenceReconstruction(vector<int<& org, vector<vector<int<>& seqs){ int n = org.size(); vector<int< graph[n + 1]; unordered_map<int, int> indegree; int idx = 0; for (int i = 0; i < seqs.size(); i++) { if (seqs[i].size() >= 1 && (seqs[i][0] > n || seqs[i][0] < 1)) return false; if (seqs[i].size() >= 1 && !indegree.count(seqs[i][0])) { indegree[seqs[i][0]] = 0; } for (int j = 1; j < seqs[i].size(); j++) { int u = seqs[i][j - 1]; int v = seqs[i][j]; graph[u].push_back(v); indegree[v]++; if (u > n || v > n || u < 1 || v < 1) return false; } } queue<int< q; for (int i = 1; i <= n; i++) { if (indegree.count(i) && indegree[i] == 0) { q.push(i); } } while (!q.empty()) { if (q.size() > 1) { return false; } if (idx == org.size()) { return false; } int node = q.front(); q.pop(); if (org[idx] != node) { return false; } idx++; for (int i = 0; i < graph[node].size(); i++) { int v = graph[node][i]; indegree[v]--; if (indegree[v] == 0) { q.push(v); } } } return idx == org.size(); } }; main(){ Solution ob; vector<int< v = {1,2,3}; vector<vector<int<> v1 = {{1,2},{1,3}}; cout << (ob.sequenceReconstruction(v, v1)); }
อินพุต
{1,2,3}, {{1,2},{1,3}}
ผลลัพธ์
0