【LeetCode-查找】在排序数组中查找数字 I

题目描述

统计一个数字在排序数组中出现的次数。
示例:

输入: nums = [5,7,7,8,8,10], target = 8
输出: 2

输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

说明: 0 <= 数组长度 <= 50000
题目链接: https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/

思路

因为是排序的数组,所以使用二分查找。使用和在排序数组中查找元素的第一个和最后一个位置一样的方法查找 target 的左边界 left 和右边界 right。如果 target 在数组中,则返回 right-left+1,否则返回 0 。

代码如下:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int first = find(nums, target, true);
        int last = find(nums, target, false);
        if(first==-1 || last==-1) return 0;
        return last-first+1;
    }

    int find(vector<int>& nums, int target, bool findFirst){
        int left = 0;
        int right = nums.size()-1;
        while(left<=right){
            int mid = left + (right-left)/2;
            if(nums[mid]>target) right = mid-1;
            else if(nums[mid]<target) left = mid+1;
            else if(nums[mid]==target){
                if(findFirst){
                    if(mid>0 && nums[mid-1]==nums[mid]) right = mid-1;
                    else return mid;
                }else{
                    if(mid<nums.size()-1 && nums[mid]==nums[mid+1]) left = mid+1;
                    else return mid;
                }
            }
        }
        return -1;
    }
};
  • 时间复杂度:O(logn)
  • 空间复杂度:O(1)
posted @ 2020-07-26 20:19  Flix  阅读(324)  评论(0编辑  收藏  举报