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

สี่เหลี่ยมผืนผ้าที่ใหญ่ที่สุดในฮิสโตแกรม

หาสี่เหลี่ยมผืนผ้าที่ใหญ่ที่สุดที่สามารถวางอยู่ใต้ฮิสโตแกรมได้

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

  • หาสี่เหลี่ยมที่กว้างที่สุดของแต่ละแท่ง
  • ใช้สแตกของความสูงที่เพิ่มขึ้น
  • แก้ปัญหาในเวลาเชิงเส้น

โจทย์

ฮิสโตแกรมมีแท่งที่มีความกว้าง 1 หน่วย โดยมีความสูงตามที่กำหนด จงหาพื้นที่ของสี่เหลี่ยมผืนผ้าที่ใหญ่ที่สุดซึ่งอยู่ภายในแท่งทั้งหมด วิธีใช้ monotonic stack สามารถแก้ปัญหานี้ได้ในเวลา O(n)

ให้เขียนฟังก์ชัน largest_rectangle(heights)

อินพุต

heights: ความสูงของแท่งแต่ละแท่งจากซ้ายไปขวา

เอาต์พุต

คืนค่าพื้นที่ที่มากที่สุด

เงื่อนไข

0 ≤ ความยาว ≤ 200,000; 0 ≤ ความสูง ≤ 1,000,000,000

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
heights = [2, 1, 5, 6, 2, 3]

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

ผลลัพธ์ที่คาดหวัง:
long long expected = 10;
อินพุต:
long[] heights = new long[] {2, 1, 5, 6, 2, 3};

ผลลัพธ์ที่คาดหวัง:
long expected = 10;

คำอธิบาย

แท่งที่ 5 และ 6 รวมกันได้สี่เหลี่ยมผืนผ้ากว้าง 2 หน่วย สูง 5 หน่วย: พื้นที่ 10

ตัวอย่างที่ 2
อินพุต:
heights = [4]

ผลลัพธ์ที่คาดหวัง:
expected = 4
อินพุต:
std::vector<long long> heights = {4};

ผลลัพธ์ที่คาดหวัง:
long long expected = 4;
อินพุต:
long[] heights = new long[] {4};

ผลลัพธ์ที่คาดหวัง:
long expected = 4;

คำอธิบาย

แท่งเดียวที่สูง 4 หน่วย มีพื้นที่ 4

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

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

คำใบ้ 1

สี่เหลี่ยมที่ดีที่สุดของแต่ละแท่งขึ้นอยู่กับว่ามันขยายได้ไกลแค่ไหนก่อนจะเจอแท่งที่เตี้ยกว่า

คำใบ้ 2

ใช้ monotonic increasing stack เพื่อหาแท่งที่เตี้ยกว่าที่ใกล้ที่สุดทั้งซ้ายและขวาของแต่ละแท่ง

คำใบ้ 3

อย่าลืมแท่งที่ไม่ถูก pop จนจบ และจัดการความสูงที่เท่ากันให้สอดคล้องกัน

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

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

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

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

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

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

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