기하학적 수열 요소를 순서대로 나타내는 배열이 제공됩니다. 진행 중 하나의 요소가 누락되어 누락된 숫자를 찾습니다. 하나의 항이 항상 결측되어 있고 결측된 항이 계열의 첫 번째 또는 마지막 항이 아니라고 가정할 수 있습니다.
예:
Input : arr[] = {1 3 27 81} Output : 9 Input : arr[] = {4 16 64 1024}; Output : 256 에이 간단한 솔루션 배열을 선형적으로 탐색하여 누락된 숫자를 찾는 것입니다. 이 솔루션의 시간 복잡도는 O(n)입니다.
.다음 자바
안 효율적인 솔루션 이진 검색을 사용하여 O(Log n) 시간 안에 이 문제를 해결합니다. 아이디어는 중간 요소로 이동하는 것입니다. 중간과 중앙 옆의 비율이 공통 비율과 같은지 확인하고 그렇지 않은 경우 누락된 요소는 중간과 중간+1 사이에 있습니다. 중간 요소가 기하 급수에서 n/2번째 항과 같은 경우(n을 입력 배열의 요소 수로 가정) 누락된 요소는 오른쪽 절반에 놓입니다. 다른 요소는 왼쪽 절반에 있습니다.
구현:
C++// C++ program to find missing number in // geometric progression #include using namespace std; // It returns INT_MAX in case of error int findMissingRec(int arr[] int low int high int ratio) { if (low >= high) return INT_MAX; int mid = low + (high - low)/2; // If element next to mid is missing if (arr[mid+1]/arr[mid] != ratio) return (arr[mid] * ratio); // If element previous to mid is missing if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio) return (arr[mid-1] * ratio); // If missing element is in right half if (arr[mid] == arr[0] * (pow(ratio mid)) ) return findMissingRec(arr mid+1 high ratio); return findMissingRec(arr low mid-1 ratio); } // Find ration and calls findMissingRec int findMissing(int arr[] int n) { // Finding ration assuming that the missing term is // not first or last term of series. int ratio = (float) pow(arr[n-1]/arr[0] 1.0/n); return findMissingRec(arr 0 n-1 ratio); } // Driver code int main(void) { int arr[] = {2 4 8 32}; int n = sizeof(arr)/sizeof(arr[0]); cout << findMissing(arr n); return 0; }
Java // JAVA Code for Find the missing number // in Geometric Progression class GFG { // It returns INT_MAX in case of error public static int findMissingRec(int arr[] int low int high int ratio) { if (low >= high) return Integer.MAX_VALUE; int mid = low + (high - low)/2; // If element next to mid is missing if (arr[mid+1]/arr[mid] != ratio) return (arr[mid] * ratio); // If element previous to mid is missing if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio) return (arr[mid-1] * ratio); // If missing element is in right half if (arr[mid] == arr[0] * (Math.pow(ratio mid)) ) return findMissingRec(arr mid+1 high ratio); return findMissingRec(arr low mid-1 ratio); } // Find ration and calls findMissingRec public static int findMissing(int arr[] int n) { // Finding ration assuming that the missing // term is not first or last term of series. int ratio =(int) Math.pow(arr[n-1]/arr[0] 1.0/n); return findMissingRec(arr 0 n-1 ratio); } /* Driver program to test above function */ public static void main(String[] args) { int arr[] = {2 4 8 32}; int n = arr.length; System.out.print(findMissing(arr n)); } } // This code is contributed by Arnav Kr. Mandal.
Python3 # Python3 program to find missing # number in geometric progression # It returns INT_MAX in case of error def findMissingRec(arr low high ratio): if (low >= high): return 2147483647 mid = low + (high - low) // 2 # If element next to mid is missing if (arr[mid + 1] // arr[mid] != ratio): return (arr[mid] * ratio) # If element previous to mid is missing if ((mid > 0) and (arr[mid] / arr[mid-1]) != ratio): return (arr[mid - 1] * ratio) # If missing element is in right half if (arr[mid] == arr[0] * (pow(ratio mid)) ): return findMissingRec(arr mid+1 high ratio) return findMissingRec(arr low mid-1 ratio) # Find ration and calls findMissingRec def findMissing(arr n): # Finding ration assuming that # the missing term is not first # or last term of series. ratio = int(pow(arr[n-1] / arr[0] 1.0 / n)) return findMissingRec(arr 0 n-1 ratio) # Driver code arr = [2 4 8 32] n = len(arr) print(findMissing(arr n)) # This code is contributed by Anant Agarwal.
C# // C# Code for Find the missing number // in Geometric Progression using System; class GFG { // It returns INT_MAX in case of error public static int findMissingRec(int []arr int low int high int ratio) { if (low >= high) return int.MaxValue; int mid = low + (high - low)/2; // If element next to mid is missing if (arr[mid+1]/arr[mid] != ratio) return (arr[mid] * ratio); // If element previous to mid is missing if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio) return (arr[mid-1] * ratio); // If missing element is in right half if (arr[mid] == arr[0] * (Math.Pow(ratio mid)) ) return findMissingRec(arr mid+1 high ratio); return findMissingRec(arr low mid-1 ratio); } // Find ration and calls findMissingRec public static int findMissing(int []arr int n) { // Finding ration assuming that the missing // term is not first or last term of series. int ratio =(int) Math.Pow(arr[n-1]/arr[0] 1.0/n); return findMissingRec(arr 0 n-1 ratio); } /* Driver program to test above function */ public static void Main() { int []arr = {2 4 8 32}; int n = arr.Length; Console.Write(findMissing(arr n)); } } // This code is contributed by nitin mittal.
PHP // PHP program to find missing number // in geometric progression // It returns INT_MAX in case of error function findMissingRec(&$arr $low $high $ratio) { if ($low >= $high) return PHP_INT_MAX; $mid = $low + intval(($high - $low) / 2); // If element next to mid is missing if ($arr[$mid+1]/$arr[$mid] != $ratio) return ($arr[$mid] * $ratio); // If element previous to mid is missing if (($mid > 0) && ($arr[$mid] / $arr[$mid - 1]) != $ratio) return ($arr[$mid - 1] * $ratio); // If missing element is in right half if ($arr[$mid] == $arr[0] * (pow($ratio $mid))) return findMissingRec($arr $mid + 1 $high $ratio); return findMissingRec($arr $low $mid - 1 $ratio); } // Find ration and calls findMissingRec function findMissing(&$arr $n) { // Finding ration assuming that the missing // term is not first or last term of series. $ratio = (float) pow($arr[$n - 1] / $arr[0] 1.0 / $n); return findMissingRec($arr 0 $n - 1 $ratio); } // Driver code $arr = array(2 4 8 32); $n = sizeof($arr); echo findMissing($arr $n); // This code is contributed by ita_c ?> JavaScript <script> // Javascript Code for Find the missing number // in Geometric Progression // It returns INT_MAX in case of error function findMissingRec(arrlowhighratio) { if (low >= high) return Integer.MAX_VALUE; let mid = Math.floor(low + (high - low)/2); // If element next to mid is missing if (arr[mid+1]/arr[mid] != ratio) return (arr[mid] * ratio); // If element previous to mid is missing if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio) return (arr[mid-1] * ratio); // If missing element is in right half if (arr[mid] == arr[0] * (Math.pow(ratio mid)) ) return findMissingRec(arr mid+1 high ratio); return findMissingRec(arr low mid-1 ratio); } // Find ration and calls findMissingRec function findMissing(arrn) { // Finding ration assuming that the missing // term is not first or last term of series. let ratio =Math.floor( Math.pow(arr[n-1]/arr[0] 1.0/n)); return findMissingRec(arr 0 n-1 ratio); } /* Driver program to test above function */ let arr=[2 4 8 32]; let n = arr.length; document.write(findMissing(arr n)); // This code is contributed by rag2127 </script>
산출
16
시간 복잡도: 오(로그인)
보조 공간: 오(로그인)
메모 : 이 솔루션의 단점은 다음과 같습니다. 값이 크거나 배열이 크면 오버플로가 발생하거나 컴퓨터 전원 공급에 더 많은 시간이 걸릴 수 있습니다.
BFS 알고리즘
퀴즈 만들기