码农小汪剑指Offer之35-数字在排序数组中出现的次数 暴力 二分查找的运用

题目描述

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

解题思路

我们看一下题目中的关键字,第一个排序数组,已经排好序了,当然不能忽略这个问题。排好序在做的算法,一想肯定二分搜索这个东西,必须的想得到涩。我们寻找数字,又是排好序的。

其实一般来说的,暴力解决这个问题,就没得艺术性可以说啦,简直没必要涩。使用二分是个比较好的选择!因为这里涉及到了统计次数。找到其中的一个。肯定在其前面或者后面还有,就像寻找就行了。注意边界就好了。

package JianzhiOffer;

public class Slution35 {
    /** * 二分解决问题~~ * @param array * @param k * @return */
    public int GetNumberOfK(int[] array, int k) {
        if (array.length == 0) {
            return 0;
        }
        int low = 0;
        int hight = array.length - 1;
        // 标记在数组中位置
        int flag = -1;
        /** * 二分 */
        while (low <= hight) {
            int mid = (low + hight) >> 1;
            if (array[mid] == k) {
                flag = mid;
                break;
            } else if (array[mid] > k) {
                hight = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        if (-1 == flag) {
            return 0;
            // 一个都没得
        }
        // 当前相同的位置,可能是前面或者后面进行遍历;
        int count = 1;
        int front = flag - 1;
        int back = flag + 1;
        // 向前寻找
        while (front >= 0 && array[front] == k) {
            count++;
            front--;

        }
        // 向后寻找
        while (back <= array.length - 1 && array[back] == k) {
            count++;
            back++;
        }
        return count;

    }
}

你可能感兴趣的:(二分查找,搜索)