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

题目描述

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

解题思路

  1. 解法1
    遍历数组,比较给定值和数组中元素的值。

  2. 二分查找
    我们需要找到第一个和最后一个k,如果中间值大于给定值k,那么k在前半段,小于k则在后半段。相等,则判断前面的值是否等于k,如果相等,说明第一个k在前面,否则第一个k就是当前值。同理找到最后一个k。因为是排序的,所以k都在一起,就可以通过最后一个k和第一个k求出k的个数。

实现

这里实现第二种解法。

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        if (array == null || array.length <= 0) return 0;
        int first = getFirstK(array,k,0,array.length-1);
        if (first == -1) return 0;
        int last = getLastK(array,k,0,array.length-1);
        return last - first + 1;
    }

    private int getLastK(int[] array, int k, int start, int end) {
        if (start > end) return -1;
        int mid = (start+end) / 2;
        if (array[mid] > k){
            return getLastK(array, k, start, mid - 1);
        }else if (array[mid] < k){
            return getLastK(array, k, mid + 1, end);
        }else {
            if (mid==end || (mid < end && array[mid+1] != k)){
                return mid;
            }else {
                return getLastK(array, k, mid+1, end);
            }
        }
    }

    private int getFirstK(int[] array, int k, int start, int end) {
        if (start > end) return -1;
        int mid = (start+end) / 2;
        if (array[mid] > k){
            return getFirstK(array, k, start, mid - 1);
        }else if (array[mid] < k){
            return getFirstK(array, k, mid + 1, end);
        }else {
            if (mid==start || (mid > start && array[mid-1] != k)){
                return mid;
            }else {
                return getFirstK(array, k, start, mid-1);
            }
        }
    }
}
posted @ 2016-08-22 09:42  峰扬迪  阅读(187)  评论(0)    收藏  举报