《剑指offer》面试题53 - I. 在排序数组中查找数字 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

代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n = nums.size(),left = 0,right = n-1,ans= 0,middle;
        if(n == 0)return 0;
        //先找左边界,再向右寻找
        while(left < right)
        {
            middle = left + (right - left)/2;
            if(nums[middle] < target)
                left = middle+1;
            else
                right = middle;
        }
        while(left < n && nums[left]==target)++left,++ans;
        return ans;
    }
};

结果

执行用时 :12 ms, 在所有 C++ 提交中击败了71.11%的用户
内存消耗 :13.1 MB, 在所有 C++ 提交中击败了100.00%的用户

代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n = nums.size(),left = 0,right = n-1,middle,tmp;
        if(n == 0)return 0;
        //先找左边界
        while(left < right)
        {
            middle = left + (right - left)/2;
            if(nums[middle] < target)
                left = middle+1;
            else
                right = middle;
        }
        //再找右边界left可以不用动了
        right = n-1;
        if(nums[left] != target)return 0;//如果没有找到直接返回
        tmp = left;
        while(left < right)
        {
            middle = left + (right-left+1)/2;//注意找右中值
            if(nums[middle] > target)
                right = middle - 1;
            else 
                left = middle;
        }
        
        return right - tmp + 1;
    }
};

结果

执行用时 :16 ms, 在所有 C++ 提交中击败了47.55%的用户
内存消耗 :13.3 MB, 在所有 C++ 提交中击败了100.00%的用户

代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int ans=0;
        for(int i:nums)
        {
            if(i == target){
                ++ans;
            }
            else if(i > target)
                break;
        }
        return ans;
    }
};

结果

执行用时 :20 ms, 在所有 C++ 提交中击败了31.61%的用户
内存消耗 :13.3 MB, 在所有 C++ 提交中击败了100.00%的用户

代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        return upper_bound(nums.begin(), nums.end(), target) - lower_bound(nums.begin(), nums.end(), target);
    }
};

结果

执行用时 :16 ms, 在所有 C++ 提交中击败了47.55%的用户
内存消耗 :13.2 MB, 在所有 C++ 提交中击败了100.00%的用户
posted @ 2020-04-19 09:50  曲径通霄  阅读(119)  评论(0编辑  收藏  举报