剑指offer 53 在排序数组中查找数字

链接

第一种方法

class Solution {
public:
    int search(vector<int>& nums, int target) {

        int sum = 0;
        for(auto item : nums)
        if(item == target)
        sum++;

        return sum;
    }
};

第二种,二分搜索

class Solution {
public:
    int search(vector<int>& nums, int target) {

       int beg = findBeginPos(nums,target);
       int end = findEndPos(nums,target);

       if(beg == -1 && end == -1) return 0;
       if(beg == -1 || end == -1) return 1;

       return end - beg + 1;

    }

int findEndPos(vector<int>nums,int target)
{
   int left = 0; 
   int right = nums.size()-1;

      while(left <= right) {
     
        int mid;
               mid = (right + left) / 2;
            //如果中间值和目标值相等
            if(nums[mid] == target) {
                if(mid ==  nums.size() - 1|| nums[mid + 1] > target)
                 return mid;
                 left = mid  + 1;
            }else if(nums[mid] < target) {
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
    return -1;
}

    int findBeginPos(vector<int>nums,int target)
    {
        //左指针和右指针 指向两端
        int left = 0; int right = nums.size() - 1;

       
        while(left <= right) {
   
 int mid;
                 mid = (right + left) / 2;
            //如果中间值和目标值相等
            if(nums[mid] == target) {
                if(mid == 0 || nums[mid - 1] < target)
                 return mid;
                 right = mid -1;
            }else if(nums[mid] > target) {
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
      return -1;
    }
};

Guess you like

Origin blog.csdn.net/yonggandess/article/details/121389533