剑指offer(53)- I
剑指offer(53)- I
剑指 Offer 53 - I. 在排序数组中查找数字 I
难度简单309
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums
是一个非递减数组-109 <= target <= 109
在labuladong的算法小抄中学习过,利用二分查找去寻找左右边界即可
class Solution {
public:
//利用二分查找 找出左右边界
int search(vector<int>& nums, int target) {
if(nums.size()==0)return 0;
int leftBoard=leftSearch(nums,target);
int rightBoard=rightSearch(nums,target);
return (leftBoard==-1&&rightBoard==-1)?0:rightBoard-leftBoard+1;
}
int leftSearch(vector<int>nums,int target){
//搜索左边界
int l=0,r=nums.size()-1;
while(l<=r){
int mid=l+(r-l)/2;
if(nums[mid]<target){
l=mid+1;
}
else if(nums[mid]>target){
r=mid-1;
}
else if(nums[mid]==target){
//缩小右边界因为我们要找左边界
r=mid-1;
}
}
//判断越界情况
if(l<0||l>nums.size()-1||nums[l]!=target){
return -1;
}
return l;
}
int rightSearch(vector<int>nums,int target){
//搜索右边界
int l=0,r=nums.size()-1;
while(l<=r){
int mid=l+(r-l)/2;
if(nums[mid]<target){
l=mid+1;
}
else if(nums[mid]>target){
r=mid-1;
}
else if(nums[mid]==target){
//缩小左边界因为我们要找右边界
l=mid+1;
}
}
//判断越界情况
if(r<0||r>nums.size()-1||nums[r]!=target){
return -1;
}
return r;
}
};
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16223711.html