โจทย์
ด้วย async/await เราเริ่มงานหลายงานให้ทำพร้อมกันได้ และมักใช้ SemaphoreSlim จำกัดจำนวนงานที่ทำพร้อมกัน
งานหมายเลข 0 ถึง n − 1 ใช้เวลา durations[i] หน่วย ที่เวลา 0 ให้เริ่มงานให้มากที่สุดเท่าที่ limit อนุญาต ตามลำดับหมายเลข เมื่อใดที่มีงานเสร็จ ให้บันทึกงานนั้น (ถ้าหลายงานเสร็จพร้อมกัน หมายเลขน้อยกว่ามาก่อน) แล้วเริ่มงานที่รออยู่ถัดไปตามลำดับหมายเลขทันทีเพื่อเติมช่องที่ว่าง
จงเขียน parallel_task_order(durations, limit)
อินพุต
durations: เวลาที่แต่ละงานใช้
limit: จำนวนงานสูงสุดที่ทำพร้อมกันได้
เอาต์พุต
คืนหมายเลขงานตามลำดับที่เสร็จ
เงื่อนไข
1 ≤ n ≤ 100,000
1 ≤ durations[i] ≤ 10^6; 1 ≤ limit ≤ n
ตัวอย่าง
อินพุต:
limit = 2
durations = [4, 2, 3, 1]
ผลลัพธ์ที่คาดหวัง:
expected = [1, 0, 2, 3]
อินพุต:
long long limit = 2;
std::vector<long long> durations = {4, 2, 3, 1};
ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {1, 0, 2, 3};
อินพุต:
long limit = 2;
long[] durations = new long[] {4, 2, 3, 1};
ผลลัพธ์ที่คาดหวัง:
long[] expected = new long[] {1, 0, 2, 3};
คำอธิบาย
งาน 0 และ 1 เริ่ม งาน 1 เสร็จที่ 2 และงาน 2 เริ่ม (เสร็จที่ 5) งาน 0 เสร็จที่ 4 และงาน 3 เริ่ม (เสร็จที่ 5) งาน 2 และ 3 เสร็จพร้อมกัน หมายเลขน้อยกว่ามาก่อน: [1, 0, 2, 3]
อินพุต:
limit = 3
durations = [3, 1, 2]
ผลลัพธ์ที่คาดหวัง:
expected = [1, 2, 0]
อินพุต:
long long limit = 3;
std::vector<long long> durations = {3, 1, 2};
ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {1, 2, 0};
อินพุต:
long limit = 3;
long[] durations = new long[] {3, 1, 2};
ผลลัพธ์ที่คาดหวัง:
long[] expected = new long[] {1, 2, 0};
คำอธิบาย
ทุกงานทำพร้อมกันและเสร็จที่ 1, 2 และ 3: [1, 2, 0]
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
เรียงงานที่กำลังทำตามเวลาเสร็จ แล้วตามหมายเลข
คำใบ้ 2
แต่ละขั้นกระโดดไปเวลาเสร็จถัดไป แล้วเก็บทุกงานที่เสร็จตอนนั้น
คำใบ้ 3
เติมช่องว่างด้วยงานที่รออยู่ถัดไปตามลำดับหมายเลข
ความซับซ้อนที่คาดหวัง
เวลา O(n log limit), หน่วยความจำเพิ่ม O(limit)
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน