ในปัญหานี้ เราได้รับอาร์เรย์ที่เรียงลำดับ arr[] และค่าจำนวนเต็ม x งานของเราคือสร้างโปรแกรมเพื่อค้นหา floor in a sorted array .
ชั้น X ในอาร์เรย์ที่จัดเรียง เป็นองค์ประกอบที่ใหญ่ที่สุดของอาร์เรย์ arr[] ซึ่งน้อยกว่าหรือเท่ากับ x
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
Input: arr[] = {2, 5, 6, 8, 9, 12, 21, 25}, x = 10 Output: 9
คำอธิบาย − ในอาร์เรย์ 9 ข้างต้นเป็นจำนวนที่มากที่สุดซึ่งน้อยกว่าหรือเท่ากับ 10
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาอย่างง่ายคือโดยตรงโดยการสำรวจอาร์เรย์และค้นหาองค์ประกอบที่ตรงตามเงื่อนไข ขณะสำรวจอาร์เรย์
เราจะตรวจสอบแต่ละองค์ประกอบ ถ้ามันมากกว่า x ให้คืนค่าองค์ประกอบก่อนหน้าเป็นพื้นของ x
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <iostream> using namespace std; int findFloorSortedArray(int arr[], int n, int x){ if (x >= arr[n - 1]) return (n-1); if (x < arr[0]) return -1; for (int i = 1; i < n; i++) if (arr[i] > x) return (i - 1); return -1; } int main(){ int arr[] = {2, 5, 6, 8, 9, 12, 21, 25}; int n = sizeof(arr) / sizeof(arr[0]); int x = 10; int floorIndex = findFloorSortedArray(arr, n - 1, x); if (floorIndex == -1) cout<<"The floor of "<<x<<" doesn't exist in the array"; else cout<<"The floor of "<<x<<" in the array is "<<arr[floorIndex]; return 0; }
ผลลัพธ์
The floor of 10 in the array is 9
วิธีอื่น
วิธีอื่นในการแก้ปัญหาคือการใช้ อัลกอริทึมการค้นหาแบบไบนารี เนื่องจากอาร์เรย์ถูกจัดเรียงและงานของเราขึ้นอยู่กับการค้นหาค่า ในโซลูชันนี้ เราจะค้นหาองค์ประกอบที่อยู่ตรงกลางดัชนีของอาร์เรย์ จากนั้นตามองค์ประกอบตรงกลาง เราจะทำการค้นหาตัวเลขในครึ่งแรก (ครึ่งที่เล็กกว่า) หรือครึ่งหลัง (ครึ่งที่มากกว่า) ของอาร์เรย์เพิ่มเติม และทำต่อไปจนกว่าอาร์เรย์ทั้งหมดจะผ่านหรือพบองค์ประกอบที่ตรงกลางของอาร์เรย์ย่อย
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <iostream> using namespace std; int findFloorSortedArray(int arr[], int start, int end, int x){ if (start > end) return -1; if (x >= arr[end]) return end; int mid = (start + end) / 2; if (arr[mid] == x) return mid; if (mid > 0 && arr[mid - 1] <= x && x < arr[mid]) return mid - 1; if (x < arr[mid]) return findFloorSortedArray(arr, start, mid - 1, x); return findFloorSortedArray(arr, mid + 1, end, x); } int main(){ int arr[] = {2, 5, 6, 8, 9, 12, 21, 25}; int n = sizeof(arr) / sizeof(arr[0]); int x = 10; int floorIndex = findFloorSortedArray(arr, 0, n - 1, x); if (floorIndex == -1) cout<<"The floor of "<<x<<" doesn't exist in the array"; else cout<<"The floor of "<<x<<" in the array is "<<arr[floorIndex]; return 0; }
ผลลัพธ์
The floor of 10 in the array is 9