用java刷剑指offer(数字在排序数组中出现的次数)

题目描述

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

牛客网链接

java代码

//看见有序就用二分法
public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        int len = array.length;
        if (len == 0) return 0;
        int low = getFirst(array, k, 0, len-1);
        int high = getEnd(array, k, 0, len-1);
        if (low != -1 && high != -1) return high - low + 1;
        return 0;
    }
    //递归
    private int getFirst(int [] array, int k, int low, int high) {
        if (low > high) return -1;
        int mid = (low + high) >> 1;
        if (array[mid] > k) return getFirst(array, k, low, mid-1);
        else if (array[mid] < k) return getFirst(array, k, mid+1, high);
        else if (mid-1>=0 && array[mid-1] == k) return getFirst(array, k, low, mid-1);
        else return mid;
    }
    //循环
    private int getEnd(int[] array, int k, int low, int high) {
        int mid = (low + high) >> 1;
        while (low <= high) {
            if (array[mid] < k) low = mid+1;
            else if (array[mid] > k) high = mid-1;
            else if (mid + 1 < array.length && array[mid + 1] == k) low = mid+1;
            else return mid;
            mid = (low + high) >> 1;
        }
        return -1;
    }
}
posted @ 2019-11-12 17:46  1Shuan  阅读(293)  评论(0编辑  收藏  举报