剑指Offer—37—数字在排序数组中出现的次数

来源:互联网 发布:刻录机软件 编辑:程序博客网 时间:2024/06/16 03:24

数字在排序数组中出现的次数:统计一个数字在排序数组中出现的次数。

package A37数字在排序数组中出现的次数;public class Solution {    public int GetNumberOfK(int [] array , int k) {        // 遍历一遍  O(N)        // 二分查找  O(logN) 找到最开始的index 和 最后的index        if (array == null) {            return 0;        }        int num = 0;        int first = getFirstIndex(array, 0, array.length-1, k);        int last = getLastIndex(array, 0, array.length-1, k);        if (first >-1 && last >-1) {            num = last-first+1;        }        return num;    }    public int getFirstIndex(int[] array,int start,int end,int k){        if (end > start){            return -1;        }        int mid = (start+end) >> 1;        int midData = array[mid];        if (midData == k){            if (mid == start || array[mid-1] != k){                return mid;  // 满足这个条件一定是开头第一个            }else {                end = mid - 1;  // 否则前面还有等于K的,继续寻找            }        }else {            if (array[mid] > k){                end = mid-1;            }else {                start = mid +1;            }        }        return getFirstIndex(array,start,end,k);    }    public int getLastIndex(int[] array,int start,int end,int k){        if (end > start){            return -1;        }        int mid = (start+end) >> 1;        int midData = array[mid];        if (midData == k){            if (mid == end || array[mid+1] != k){                return mid;            }else {                start = mid+1;            }        }else {            if (array[mid]>k){                end = mid-1;            }else {                start = mid+1;            }        }        return getLastIndex(array,start,end,k);    }}