【基础算法】数字在排序数组中出现的次数问题

18 阅读2分钟

🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,==强大自己才是核心==。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟 👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏

@TOC


前言

今天我们继续学习算法,加油。这篇文章写的是大数运算问题。希望这篇可以有幸帮助到你,码字不易,请多多支持。 在这里插入图片描述


题目链接:AcWing 67. 数字在排序数组中出现的次数

题目描述:

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

样例:

输入:[1,2,3,3,3,3,4,5],3 输出:4

解题思路:

因为给出的是一个排序数组,所以我们可以想到二分查找。我们可以分别找到这个数字第一次出现的位置和最后一次出现的位置,然后相减加一即可。

代码实现:

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    int getFirstK(vector<int>& nums, int k) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < k) left = mid + 1;
            else right = mid - 1;
        }
        if (left >= nums.size() || nums[left] != k) return -1;
        return left;
    }

    int getLastK(vector<int>& nums, int k) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] <= k) left = mid + 1;
            else right = mid - 1;
        }
        if (right < 0 || nums[right] != k) return -1;
        return right;
    }

    int getNumberOfK(vector<int>& nums , int k) {
        if (nums.empty()) return 0;
        int firstK = getFirstK(nums, k);
        int lastK = getLastK(nums, k);
        if (firstK == -1 || lastK == -1) return 0;
        return lastK - firstK + 1;
    }
};

int main() {
    Solution solution;
    vector<int> nums = {1, 2, 3, 3, 3, 3, 4, 5};
    int k = 3;
    cout << solution.getNumberOfK(nums, k) << endl;
    return 0;
}

时间复杂度:O(logn)O(logn) 空间复杂度:O(1)O(1)

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.把时间尺度拉长,拉长十年看当下

2.不说负面情绪,只描述事实;

3.越专注于过好自己,能量和幸运越会照顾你; 只解决问题,不做没有意义的担心,输了就认;

4.学会原谅自己,要允许自己做错事,允许自己出现情绪波动,我知道你已经很努力很努力在做好了

5.所有你害怕的、想逃避的事情,最终都要面对,既然这样不如选择坦然面对。即使结果不如人愿,没关系,至少这个过程是享受的,而不是一路带着恐惧和害怕。

最后如果觉得我写的还不错,请不要忘记==点赞==✌,==收藏==✌,加==关注==✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚==菜鸟==逐渐成为==大佬==。加油,为自己点赞!