题目描述
统计一个数字在排序数组中出现的次数。
解题思路
这道题我不是按照循环查找数字的,说下我的想法吧。我是通过递归找出这个数字的开头下标,通过二分找出这个数字的结尾下标,这么一来就可以快速找到有多少个这个数字了。时间复杂度为o(logn)。如果你是按照循环的话,最坏的情况下时间复杂度为o(n)。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array == null || array.length == 0) return 0;
if(array[0] > k || array[array.length - 1] < k) return 0;
int startIndex = getStartIndex(array, 0, array.length - 1, k);
int endIndex = getEndIndex(array, 0, array.length - 1, k);
if(startIndex != -1 && endIndex != -1)
return endIndex - startIndex + 1;
return 0;
}
// 递归 查找最开始的节点
public static int getStartIndex(int[] array, int start, int end, int k){
if(start > end) return -1;
int mid = (start + end) >> 1;
if(array[mid] > k) return getStartIndex(array, start, mid - 1, k);
else if(array[mid] < k) return getStartIndex(array, mid + 1, end, k);
else if(mid - 1 >= 0 && array[mid - 1] == k) return getStartIndex(array, start, mid - 1, k);
else return mid;
}
// 循环 查看最末的节点
public static int getEndIndex(int[] array, int start, int end, int k){
int mid = (start + end) >> 1;
while(start <= end){
if(array[mid] > k) end = mid - 1;
else if(array[mid] < k) start = mid + 1;
else if(mid + 1 < array.length && array[mid + 1] == k) start = mid + 1;
else return mid;
mid = (start + end) >> 1;
}
return -1;
}
}
以上就是这道题的解法。