โจทย์ทั้งหมด
ปานกลาง 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

ขนาดโฟลเดอร์ด้วย Composite

คำนวณขนาดรวมของทุกโฟลเดอร์ในต้นไม้ที่โฟลเดอร์ประกอบด้วยไฟล์และโฟลเดอร์อื่น ๆ

สิ่งที่คุณจะได้เรียนรู้

  • ปฏิบัติกับรายการเดี่ยวและกลุ่มแบบเดียวกัน
  • บวกยอดรวมของลูกเข้าไปที่พาเรนต์
  • ไล่ต้นไม้จากใบขึ้นไป

โจทย์

แพทเทิร์น composite ปฏิบัติกับออบเจกต์เดี่ยวและกลุ่มของออบเจกต์แบบเดียวกัน ขนาดของโฟลเดอร์คือเนื้อหาของตัวเองบวกขนาดของทุกอย่างที่อยู่ข้างใน ไม่ว่าจะลึกแค่ไหน

มี n รายการหมายเลข 0 ถึง n − 1 ซึ่งรวมกันเป็นต้นไม้ parents[i] คือโฟลเดอร์ที่บรรจุรายการ i หรือ -1 สำหรับราก (มีเพียงรายการเดียว) sizes[i] คือขนาดเนื้อหาของรายการ i เอง

จงเขียน composite_folder_sizes(parents, sizes)

อินพุต

parents: พาเรนต์ของแต่ละรายการ

sizes: ขนาดของแต่ละรายการเอง

เอาต์พุต

คืนขนาดรวมของทุกรายการ: ขนาดของตัวเองบวกขนาดรวมของลูกทั้งหมด

เงื่อนไข

1 ≤ n ≤ 100,000

0 ≤ sizes[i] ≤ 10^9; parents อธิบายต้นไม้หนึ่งต้น

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
sizes = [1, 2, 3, 4]
parents = [-1, 0, 0, 1]

ผลลัพธ์ที่คาดหวัง:
expected = [10, 6, 3, 4]
อินพุต:
std::vector<long long> sizes = {1, 2, 3, 4};
std::vector<long long> parents = {-1, 0, 0, 1};

ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {10, 6, 3, 4};
อินพุต:
long[] sizes = new long[] {1, 2, 3, 4};
long[] parents = new long[] {-1, 0, 0, 1};

ผลลัพธ์ที่คาดหวัง:
long[] expected = new long[] {10, 6, 3, 4};

คำอธิบาย

Item 3 (size 4) อยู่ภายใน item 1 ดังนั้น item 1 มีผลรวมเป็น 2 + 4 = 6. รากมี items 1 และ 2: 1 + 6 + 3 = 10. ผลลัพธ์: [10, 6, 3, 4].

ตัวอย่างที่ 2
อินพุต:
sizes = [5, 0, 7]
parents = [1, -1, 1]

ผลลัพธ์ที่คาดหวัง:
expected = [5, 12, 7]
อินพุต:
std::vector<long long> sizes = {5, 0, 7};
std::vector<long long> parents = {1, -1, 1};

ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {5, 12, 7};
อินพุต:
long[] sizes = new long[] {5, 0, 7};
long[] parents = new long[] {1, -1, 1};

ผลลัพธ์ที่คาดหวัง:
long[] expected = new long[] {5, 12, 7};

คำอธิบาย

รากคือ item 1 และไม่มีเนื้อหาของตัวเอง; มันมี items 0 และ 2 อยู่ภายใน: 0 + 5 + 7 = 12.

แนวทางการแก้

ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ

คำใบ้ 1

ยอดรวมของโฟลเดอร์คือขนาดของตัวเองบวกยอดรวมของลูก

คำใบ้ 2

ประมวลผลลูกก่อนพาเรนต์ เช่น เรียงตามความลึกจากมากไปน้อย

คำใบ้ 3

เลี่ยงการเรียกซ้ำลึก ๆ บนสายยาว ใช้สแตกหรือลำดับที่ชัดเจนจะปลอดภัยกว่า

ความซับซ้อนที่คาดหวัง

เวลา O(n), หน่วยความจำเพิ่ม O(n)

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก