พื้นที่ของสี่เหลี่ยมผืนผ้าคำนวณจากผลคูณของความยาวและความกว้าง สี่เหลี่ยมผืนผ้ามี 4 ด้าน โดยด้านตรงข้ามเท่ากัน ดังนั้นต้องการ 2 คู่ของด้านที่เท่ากันเพื่อสร้างสี่เหลี่ยมผืนผ้า
ได้รับอาร์เรย์ที่มีค่าความยาวด้านสี่เหลี่ยมผืนผ้าปนกันไปในลำดับสุ่ม งานคือหา 2 คู่ของด้านที่มีค่ามากที่สุดจากอาร์เรย์ เพื่อให้ได้พื้นที่สูงสุด
ตัวอย่าง
ตัวอย่างที่ 1
Input: Arr[] = { 1,2,1,3,4,4,2,3,5,7 }
Output: 12
คำอธิบาย: เรียงจากมากไปน้อย: { 7,5,4,4,3,3,2,2,1,1 } คู่ที่ใหญ่ที่สุด 2 คู่คือ (4,4) และ (3,3) พื้นที่ = 4 × 3 = 12
ตัวอย่างที่ 2
Input: Arr[] = { 8,2,5,3,4,9,8,3,5,7 }
Output: 40
คำอธิบาย: เรียงจากมากไปน้อย: { 9,8,8,7,5,5,4,3,3,2 } คู่ที่ใหญ่ที่สุด 2 คู่คือ (8,8) และ (5,5) พื้นที่ = 8 × 5 = 40
แนวทางแก้ปัญหา
- เรียงอาร์เรย์จากมากไปน้อย (descending)
- เดินจากด้านหน้าหาคู่ที่ติดกันเท่ากัน (
arr[i] == arr[i+1]) - เก็บค่าคู่ที่พบไว้ 2 คู่แรก (ที่มีค่ามากที่สุด)
- คูณค่าทั้งสองคู่เข้าด้วยกันได้พื้นที่สูงสุด
ตัวอย่างโค้ด (แก้ไขให้ compile ได้)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
// หาพื้นที่สูงสุดจาก 4 ด้านในอาร์เรย์
int maxArea(vector<int> arr) {
// เรียงจากมากไปน้อย
sort(arr.begin(), arr.end(), greater<int>());
int dim[2] = {0, 0}; // เก็บ 2 คู่ที่ใหญ่ที่สุด
int j = 0;
for (size_t i = 0; i + 1 < arr.size() && j < 2; ++i) {
if (arr[i] == arr[i + 1]) {
dim[j++] = arr[i];
i++; // ข้ามคู่ที่เจอไป
}
}
return dim[0] * dim[1];
}
int main() {
vector<int> arr = { 1, 8, 5, 1, 8, 2, 5, 3 };
cout << "Maximum area of rectangle: " << maxArea(arr) << endl;
return 0;
}
ผลลัพธ์
Maximum area of rectangle: 40
อาร์เรย์: {1,8,5,1,8,2,5,3} → เรียง: {8,8,5,5,3,2,1,1} → คู่: (8,8) และ (5,5) → 8×5=40
กรณีพิเศษ (Edge Cases)
- ไม่มีคู่เพียงพอ: หากหาไม่ครบ 2 คู่ (เช่น {1,2,3,4}) ควรคืนค่า 0 หรือจัดการ error
- คู่มากกว่า 2 คู่: อัลกอริทึมจะเลือก 2 คู่ที่มีค่ามากที่สุด (เพราะเรียงจากมากไปน้อยแล้ว)
- ค่าซ้ำมาก: {4,4,4,4,4,4} → จะเลือก (4,4) และ (4,4) ได้พื้นที่ 16
การปรับปรุงโค้ดต้นฉบับ
โค้ดต้นฉบับมีปัญหาหลายจุด:
- ใช้
sort(arr,n)ซึ่งไม่ใช่ syntax มาตรฐาน (ควรเป็นsort(arr, arr+n)หรือใช้ vector) - ลูป while มี bug:
++iทุกครั้ง ทำให้ข้ามการตรวจสอบคู่บางคู่ - ไม่ตรวจสอบกรณีไม่พบคู่ครบ 2 คู่
โค้ดที่แก้ไขข้างบนใช้ vector และ sort แบบมาตรฐาน พร้อมตรวจสอบขอบเขตอาร์เรย์