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

来源:互联网 发布:数据分析功能 编辑:程序博客网 时间:2024/06/15 23:21

二分查找第一个大于等于这个数的位置,然后再二分查找第一个大于这个数的位置,然后用后者减去前者。

public class Solution {    public int GetNumberOfK(int [] array , int k) {        if(array == null || array.length == 0) return 0;        int first_bound = Find1(array, k);        int second_bound = Find2(array, k);        return second_bound - first_bound;    }    public int Find1(int[] array, int k) {        int low = 0;        int high = array.length - 1;        while (low <= high) {            int mid = low + (high - low) / 2;            if(array[mid] >= k) {                high = mid-1;                if(high < 0 || ! (array[high] >= k)) {                    return mid;                }            } else if(array[mid] < k) {                low = mid + 1;            }        }        return low;    }    public int Find2(int[] array, int k) {        int low = 0;        int high = array.length - 1;        while (low <= high) {            int mid = low + (high-low) / 2;            if(array[mid] > k) {                high = mid - 1;                if(high < 0 || !(array[high] > k)) {                    return mid;                }            } else if(array[mid] <= k) {                low = mid + 1;            }        }        return low;    }    public static void main(String[] args) {        Solution solution = new Solution();        int array[] = new int[] {                1, 2, 2, 2, 2, 2, 3, 4        };        System.out.println(solution.GetNumberOfK(array, 5));    }}
阅读全文
1 0
原创粉丝点击