คำอธิบายปัญหา
ได้รับอาร์เรย์ arr[] ขนาด n ที่ประกอบด้วยจำนวนบวก ต้องการหา ค่าต่ำสุด (minimum) ในอาร์เรย์ โดยห้ามใช้ Relational Operators (เช่น ==, >, <, >=, <=)
ตัวอย่าง
Input: arr[] = {4, 2, 5, 1, 7}
Output: 1
คำอธิบาย: สมาชิกที่เล็กที่สุดคือ 1
แนวทางแก้ปัญหา
แนวคิดคือการ ลดค่าทั้งสองจำนวนลงทีละ 1 จนกว่าจะมีตัวใดตัวหนึ่งเป็น 0 จำนวนรอบที่ลดได้ก่อนจะถึง 0 ก็คือค่าต่ำสุดของสองจำนวนนั้น
เช่นเปรียบเทียบ a และ b:
- ลด
a--และb--พร้อมกัน นับจำนวนรอบ (minVal++) - เมื่อ
a == 0หรือb == 0หยุด →minValคือค่าต่ำสุด
นำวิธีนี้มาเปรียบเทียบค่าต่ำสุดปัจจุบันกับสมาชิกถัดไปในอาร์เรย์ทีละตัว
โค้ดตัวอย่าง C++
#include <iostream>
using namespace std;
int findMin(int a, int b) {
int minVal = 0;
while (a && b) { // ทั้งคู่ต้องไม่เป็น 0
minVal++;
a--;
b--;
}
return minVal;
}
int findMinimumElement(int arr[], int n) {
int minVal = arr[0];
int i = n - 1;
while (i) {
minVal = findMin(minVal, arr[i]);
i--;
}
return minVal;
}
int main() {
int arr[] = {4, 2, 5, 1, 7};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "The minimum element is " << findMinimumElement(arr, n);
return 0;
}
ผลลัพธ์
The minimum element is 1
หมายเหตุ:
วิธีนี้ใช้ได้กับจำนวนเต็มบวกเท่านั้น และมี Complexity สูง (O(n × min_value)) เหมาะสำหรับการศึกษาแนวคิดมากกว่าการใช้งานจริง