ในข้อนี้ กำหนดให้อาร์เรย์ A ประกอบไปด้วยความสูงของตึก ณ เวลาใด ๆ โดย Ai เมื่อ 0≤i≤n−1 เป็นความสูงของตึกตำแหน่ง i
เมื่อมีการสร้างตึก ณ ตำแหน่ง i โดยมีความสูง h เราจะกำหนดให้ Ai:=h และค่า d ของตึกนี้ จะเป็นไปได้ 2 กรณีได้แก่
- ตึกนี้เป็นตึกที่สูงที่สุด ดังนั้นจะได้ว่า d=n
- มีอย่างน้อยหนึ่งตึก j ที่ Aj>Ai ดังนั้นจะได้ว่า d=(0≤j≤n−1,Aj>Aimin∣i−j∣)−1
สำหรับกรณีที่ 2 หากเราไล่หาทีละ j จะทำให้ใช้เวลา O(n) ต่อการสร้างตึก แต่สังเกตว่าตึก i จะเป็นตึกที่สูงที่สุดในระยะ k กิโลเมตร ก็ต่อเมื่อ max(max{Ai−k,Ai−k+1,…,Ai−1},max{Ai+1,Ai+2,…,Ai+k})≤Ai และเมื่อตึก i เป็นตึกที่สูงที่สุดในระยะ k กิโลเมตรแล้ว ก็จะได้ว่าเป็นตึกที่สูงที่สุดในระยะ 0,1,2,…,k−1 กิโลเมตรเช่นกัน
ดังนั้น จากคุณสมบัติด้านบนนี้ เราจะสามารถ Binary Search เพื่อหา k ที่มากที่สุดที่ตึก i ยังคงเป็นตึกที่สูงที่สุดในระยะ k กิโลเมตร โดยสำหรับการหาค่า max{Ai−k,Ai−k+1,…,Ai−1} และ max{Ai+1,Ai+2,…,Ai+k} สามารถหาได้ภายใน O(logn) ด้วยการเก็บอาร์เรย์ A ในรูปของ Segment Tree ที่รองรับการหาค่าที่มากที่สุดเป็นช่วงนั่นเอง
จากวิธีดังกล่าว ในการสร้างตึกแต่ละครั้ง เราจะสามารถหาค่า d ได้ภายในเวลา O(log2n) หรือ O(logn) ขึ้นกับการ Implementation
Time Complexity: O(klog2n) หรือ O(klogn)