剑指OFFER_在排序数组中查找数字 I

剑指OFFER_在排序数组中查找数字 I

题目

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

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: 2

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

限制:

0 <= 数组长度 <= 50000

思路

最简单的方法应该是遍历数组,但是这样太简单了,感觉会超时,所以就没有尝试;

于是我写了一个二分查找,使得程序可以更快的找到目标数字的位置,如果不存在返回-1;

找到目标数字的位置,它的前后可能有重复的,因此只需要前后搜索一下就可以了:

代码

typedef vector<int> vec;
class Solution {
public:
    int binarySearch(vec &v, int begin, int end, int target) {
        int mid = (begin+end)/2;
        if (v[mid] == target) {
            return mid;
        } else if (end-begin<=1) {
            if (v[end] == target) {
                return end;
            }else {
                return -1;
            }
        } else if (v[mid] > target) {
            return binarySearch(v, begin, mid, target);
        } else {
            return binarySearch(v, mid, end, target);
        }
    }

    int search(vector<int>& nums, int target) {
        int len = nums.size(), ans = 0;
        if (len==0) return 0;
        int pos = binarySearch(nums, 0, len-1, target);
        if (pos == -1) return 0;

        for (int i=pos; i>=0; i--) {
            if(nums[i] == target) {
                ++ans;
            }else{
                break;
            }
        }
        for (int i=pos; i<len; i++) {
            if(nums[i] == target) {
                ++ans;
            }else{
                break;
            }
        }
        return ans-1;
    }
};
posted @ 2020-07-21 22:00  樱花小猪  阅读(117)  评论(0编辑  收藏  举报