剑指offer 面试题53 - I. 在排序数组中查找数字 I [简单]

我的解题:

1.先用二分查找找到target,在由该节点向左右遍历看有多少相等的

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int i=0;
        int j=nums.size()-1;
        int count=0;
        int mid;
        while(i<=j){
            mid=(i+j)/2;
            if(nums[mid]==target){
                count++;
                break;
            }
            if(nums[mid]>target)    j=mid-1;
            else if(nums[mid]<target)   i=mid+1;
        }
        if(count==0)    return 0;
        for(int tmp=mid+1;tmp<nums.size();tmp++){
            if(nums[tmp]==target) count++;
        }
        for(int tmp=mid-1;tmp>=0;tmp--){
            if(nums[tmp]==target)  count++;
        }
        return count;
    }
};

2.用两次二分查找

class Solution {
public:
    int func(vector<int>nums,int n){
        int i=0;
        int j=nums.size()-1;
        while(i<j){
            int mid=(i+j)/2;
            if(nums[mid]>=n)    j=mid;
            else    i=mid+1;
        }
        return i;
    }
    int search(vector<int>& nums, int target) {
        if(!nums.size())    return 0;
        int i=func(nums,target);
        int j=func(nums,target+1);
        if(nums[j]==target) return j-i+1;
        else    return j-i;
    }
};

发布了76 篇原创文章 · 获赞 1 · 访问量 591

猜你喜欢

转载自blog.csdn.net/qq_41041762/article/details/105569871