기하학적 진행 요소를 순서대로 나타내는 배열이 있다고 가정합니다. 하나의 요소가 누락되었습니다. 누락된 요소를 찾아야 합니다. 따라서 arr =[1, 3, 27, 81]이면 9가 없기 때문에 출력은 9입니다.
이진 검색을 사용하여 이 문제를 해결할 수 있습니다. 중간 요소로 이동한 다음 중간과 중간 옆의 비율이 공통 비율과 같은지 여부를 확인합니다. 그렇지 않으면 누락된 요소가 인덱스 중간과 중간 + 1 사이에 존재합니다. 중간 요소가 GP의 n/2번째 요소이면 누락된 요소는 오른쪽 절반에 있고 그렇지 않으면 왼쪽 절반에 있습니다.
예시
#include <iostream> #include <cmath> using namespace std; class Progression { public: int missingUtil(int arr[], int left, int right, int ratio) { if (right <= left) return INT_MAX; int mid = left + (right - left) / 2; if (arr[mid + 1] - arr[mid] != ratio) return (arr[mid] * ratio); if (mid > 0 && arr[mid] / arr[mid - 1] != ratio) return (arr[mid - 1] * ratio); if (arr[mid] == arr[0] * pow(ratio, mid)) return missingUtil(arr, mid + 1, right, ratio); return missingUtil(arr, left, mid - 1, ratio); } int missingElement(int arr[], int n) { int ratio = pow(arr[n-1]/arr[0], 1.0/n); return missingUtil(arr, 0, n - 1, ratio); } }; int main() { Progression pg; int arr[] = {1, 3, 27, 81}; int n = sizeof(arr) / sizeof(arr[0]); cout << "The missing element is: " << pg.missingElement(arr, n); }
출력
The missing element is: 9