สมมุติว่าเรามี n จำนวนเต็มไม่เป็นลบ a1, a2, ..., an, แต่ละค่าแสดงถึงจุดที่พิกัด (i, a[i]) มีเส้นแนวตั้งในลักษณะที่จุดสิ้นสุดสองจุดของเส้น i อยู่ที่ (i, a[i]) และ (i, a[0]) เราต้องหาเส้นสองเส้น ซึ่งรวมกันกับแกน x ทำให้เกิดภาชนะเดียว ดังนั้นเป้าหมายของเราคือหาสองคอลัมน์ที่มีปริมาตรน้ำสูงสุด ดังนั้นหากอาร์เรย์เป็นแบบ [1,8,6,2,5,4,8,3,7] ก็จะเป็น
ในส่วนแรเงา ความสูงคือ 7 และมี 7 ส่วน ดังนั้นพื้นที่ทั้งหมดจึงเท่ากับ 7 * 7 =49 นี่คือผลลัพธ์
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้
- ต่ำ :=0, สูง :=ความยาวของ arr – 1, ตอบ :=0
- ในขณะที่ต่ำ <สูง
- ถ้า arr[ต่ำ]
- มิฉะนั้น min_h :=height[high] และ min_ind :=high
- ans :=สูงสุดของ (สูง – ต่ำ)* min_h และ ans
- ถ้าต่ำ + 1 =min_ind + 1 ให้เพิ่มระดับต่ำขึ้น 1 ไม่เช่นนั้นให้ลดระดับสูงลง 1
- ถ้า arr[ต่ำ]
- คืนสินค้า
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น −
class Solution(object): def maxArea(self, height): low = 0 high = len(height) - 1 ans = 0 while low < high: if height[low]<height[high]: min_height = height[low] min_height_index = low else: min_height = height[high] min_height_index = high ans = max(((high - low) ) * min_height,ans) if low+1==min_height_index+1: low+=1 else: high-=1 return ans ob1 = Solution() print(ob1.maxArea([1,8,6,2,5,4,8,3,7]))
อินพุต
[1,8,6,2,5,4,8,3,7]
ผลลัพธ์
49