次のプログラミングの質問を解決しています。
Given a sorted integer array and a number, find the start and end indexes of the number in the array.
Ex1: Array = {0,0,2,3,3,3,3,4,7,7,9} and Number = 3 --> Output = {3,6}
Ex2: Array = {0,0,2,3,3,3,3,4,7,7,9} and Number = 5 --> Output = {-1,-1}
Complexity should be less than O(n)
私の解決策は次のとおりです。
public static void findStartEndIndex(int[] arr, int elem) {
int elemIndex = binarySearch(arr, elem, 0, arr.length);
if(elemIndex == -1)
System.out.println("-1,-1");
int lowIndex = elemIndex - 1;
int highIndex = elemIndex + 1;
//Find the first index in the lower half of the array
while(lowIndex >= 0 && (elemIndex = binarySearch(arr, elem, 0, lowIndex)) != -1)
lowIndex = elemIndex -1;
//Find the last index in the upper half of the array
while(highIndex < arr.length && (elemIndex = binarySearch(arr, elem, highIndex, arr.length - 1)) != -1)
highIndex = elemIndex + 1;
System.out.println((lowIndex + 1) + ", " + (highIndex -1));
}
上記のプログラムの時間計算量を見つけるのに苦労しています。以下は私のアプローチです:
私の理解では、最悪のケースはすべての要素が同じ場合{3,3,3,3,3,3}
です。最初の出現を見つけるにはコストがかかります:O(logn) //Binary Search
配列の半分 (上下) ごとに、ほとんどの場合 binarySearch を呼び出していO(logn)
ます。したがって、全体の複雑さは次のようになりますO(logn ^2)
これは正しい分析ですか?そして、O(logn^2)
より良いですO(n)
か?