剑指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;
   }
};
posted @ 2022-05-05 10:13  BailanZ  阅读(14)  评论(0编辑  收藏  举报