/*
* 面试题题53-题目一:数字在排序数组出现的次数
* 题目:统计一个数字在排序数组中出现的次数
* 思路:利用二分查找+递归思想,进行寻找。当目标值与中间值相等时进行判断
*/
public class No53GetNumberOfK {
public static void main(String[] args) {
No53GetNumberOfK n = new No53GetNumberOfK();
int[] arr = {1,1,2,3,3,3,3,3,4,5,6,7};
System.out.println(n.GetNumberOfK(arr, 3));
}
public int GetNumberOfK(int[] array, int k) {
int number = 0;
if (array != null && array.length != 0) {
int first = getFirstK(array, k, 0, array.length - 1);
int last = getLastK(array, k, 0, array.length - 1);
if (first > -1 && last > -1) {
number = last - first + 1;
}
}
return number;
}
//找到排序数组中的最后一个K
private int getLastK(int[] array, int k, int start, int end) {
if (start > end) {
return -1;
}
int midIndex = (start + end) / 2;
int midData = array[midIndex];
if (midData == k) {
if((midIndex < array.length - 1 && array[midIndex + 1] != k) || midIndex == array.length -1 ) {
return midIndex;
} else {
start = midIndex + 1;
}
} else if (midData < k) {
start = midIndex + 1;
} else {
end = midIndex - 1;
}
return getLastK(array,k,start,end);
}
//找到排序数组中的第一个K
private int getFirstK(int[] array, int k, int start, int end) {
if (start > end) {
return -1;
}
int midIndex = (start + end) / 2;
int midData = array[midIndex];
if (midData == k) {
if((midIndex > 0 && array[midIndex - 1] != k) || midIndex == 0 ) {
return midIndex;
} else {
end = midIndex - 1;
}
} else if (midData < k) {
start = midIndex + 1;
} else {
end = midIndex - 1;
}
return getFirstK(array,k,start,end);
}
}
面试题题53-题目一:数字在排序数组出现的次数
猜你喜欢
转载自blog.csdn.net/juaner1993/article/details/82760560
今日推荐
周排行