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