สมมติว่าเรามีอาร์เรย์ของบางจุดในระนาบ XY เราต้องหาพื้นที่ต่ำสุดของสี่เหลี่ยมที่สามารถสร้างได้จากจุดเหล่านี้ ด้านข้างของสี่เหลี่ยมผืนผ้าควรขนานกับแกน X และ Y หากเราไม่สามารถสร้างสี่เหลี่ยมผืนผ้าได้ ให้คืนค่า 0 ดังนั้นหากอาร์เรย์ของจุดเป็น [(1, 1), (1, 3), (3, 1), (3, 3), (2, 2)] . ผลลัพธ์จะเป็น 4 เนื่องจากสามารถสร้างสี่เหลี่ยมผืนผ้าได้โดยใช้จุด (1, 1), (1, 3), (3, 1) และ (3, 3)
ในการแก้ปัญหานี้ ให้กำหนดจุดด้วยพิกัด x เพื่อที่จุดบนเส้นแนวตั้งที่เป็นเส้นตรงจะถูกจัดกลุ่มเข้าด้วยกัน จากนั้นสำหรับแต่ละคู่ของจุดในกลุ่ม เช่น (x, y1) และ (x, y2) เราจะพบสี่เหลี่ยมที่เล็กที่สุดที่มีจุดคู่นี้ เป็นขอบขวาสุดของสี่เหลี่ยมที่จะสร้าง เราสามารถทำได้โดยการติดตามจุดคู่อื่น ๆ ทั้งหมดที่เราเคยไปมาก่อน สุดท้ายให้คืนค่าพื้นที่ต่ำสุดที่เป็นไปได้ของสี่เหลี่ยมผืนผ้าที่ได้รับ
ตัวอย่าง
import collections
def findMinArea(Arr):
columns = collections.defaultdict(list)
for x, y in Arr:
columns[x].append(y)
lastx = {}
ans = float('inf')
for x in sorted(columns):
col = columns[x]
col.sort()
for j, y2 in enumerate(col):
for i in range(j):
y1 = col[i]
if (y1, y2) in lastx:
ans = min(ans, (x - lastx[y1, y2]) * (y2 - y1))
lastx[y1, y2] = x
if ans < float('inf'):
return ans
else:
return 0
A = [[1, 1], [1, 3], [3, 1], [3, 3], [2, 2]]
print('Minimum area of rectangle:',findMinArea(A)) ผลลัพธ์
Minimum area of rectangle: 4