首页 剑指 Offer 53 - I. 在排序数组中查找数字 I
文章
取消

剑指 Offer 53 - I. 在排序数组中查找数字 I

题目描述

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

示例 1:

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

示例 2:

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

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

解题

方法 1

二分法找 target 和 target - 1 的右边界,taget 数量为 target 的右边界 - target - 1 的右边界

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
private:
    int binarySearch(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 r = mid - 1;
        }

        return l;
    }
public:
    int search(vector<int>& nums, int target) {
        return binarySearch(nums, target) - binarySearch(nums, target - 1);
    }
};

复杂度分析:

  • 时间复杂度 O(log2N) : 二分查找 N 个元素的数组,时间为 O(log2N)

  • 空间复杂度 O(1) : 没有使用额外的存储

方法 2

查找 target 的左右边界

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l = 0, r = nums.size() - 1;
        int left = nums.size();
        while ( l <= r ) {
            int mid = l + (r - l) / 2;
            if ( nums[mid] < target ) l = mid + 1;
            else {
                r = mid - 1;
                left = mid;
            }
        }

        l = 0;
        r = nums.size() - 1;
        int right = nums.size();
        while ( l <= r ) {
            int mid = l + (r - l) / 2;
            if ( nums[mid] <= target ) {
                l = mid + 1;
                right = mid;
            } else r = mid - 1;
        }
        //right = right - 1;

        if ( left < nums.size() && right < nums.size() && nums[left] == target && nums[right] == target ) {
            return right - left + 1;
        }

        return 0;
    }
};

复杂度分析:

  • 时间复杂度 O(log2N) : 二分查找 N 个元素的数组,时间为 O(log2N)

  • 空间复杂度 O(1) : 没有使用额外的存储

写在最后

感谢你在茫茫人海中找到我🕵🏼

🎉你是第 个读者

㊗️ 你平安喜乐,顺遂无忧!

希望你读完有所收获~

本文由作者按照 CC BY 4.0 进行授权

剑指 Offer 53 - II. 0~n-1中缺失的数字

剑指 Offer 63. 股票的最大利润