1. 程式人生 > 實用技巧 >劍指OFFER_在排序陣列中查詢數字 I

劍指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;
    }
};