剑指offer 数字在排序数组中出现的次数
发布日期:2021-05-12 14:28:33 浏览次数:13 分类:精选文章

本文共 3605 字,大约阅读时间需要 12 分钟。

���������������������������������������������������

���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

������

���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

���������������������������������

������������������������������������������������������������������������������������������������������������������������������������������

  • ������leftLimit������������������������������������������������������������
  • ������rightLimit���������������������������������������������������������������
  • ������������������������left���right���������������
  • ������right - left + 1���������������������������������������
  • ���������C++������������������������

    int GetNumberOfK(std::vector
    data, int k) {
    if (data.size() < 1) {
    return 0;
    }
    int left = leftLimit(data, k, 0, data.size());
    int right = rightLimit(data, k, -1, data.size() - 1);
    return (right - left + 1);
    }
    int rightLimit(std::vector
    data, int k, int left, int right) {
    while (left < right) {
    int mid = (left + right + 1) / 2;
    if (data[mid] <= k) {
    left = mid;
    } else {
    right = mid - 1;
    }
    }
    return right;
    }
    int leftLimit(std::vector
    data, int k, int left, int right) {
    while (left < right) {
    int mid = (left + right) / 2;
    if (data[mid] >= k) {
    right = mid;
    } else {
    left = mid + 1;
    }
    }
    return left;
    }

    ������������

    • leftLimit������������������������������������������k������������
    • rightLimit���������������������������������������������k������������
    • ������������������������������right - left + 1���

    ������������������STL���������������

    C++���������������������std::equal_range������������������������������������������������������������������������������������������������������

    int GetNumberOfK(std::vector
    data, int k) {
    auto resultPair = std::equal_range(data.begin(), data.end(), k);
    return resultPair.second - resultPair.first;
    }

    ������������

    • std::equal_range������pair���������������pair.first������������������k������������pair.second���������������������k������������
    • ������������������������������������������������

    ������������������������������������������

    ���������������������������������������������k-0.5���k+0.5������������������������������������������

    int GetNumberOfK(std::vector
    data, int k) {
    int start = biSearch(data, k - 0.5);
    int end = biSearch(data, k + 0.5);
    return end - start;
    }
    int biSearch(const std::vector
    & data, double num) {
    int s = 0, e = data.size() - 1;
    while (s <= e) {
    int mid = (e - s) / 2 + s;
    if (data[mid] < num) {
    s = mid + 1;
    } else if (data[mid] > num) {
    e = mid - 1;
    }
    }
    return s;
    }

    ������������

    • biSearch���������������������������������������������������������k-0.5���k+0.5������������������������
    • start������������������k������������end���������������������k������������
    • ���������������end - start���

    ���������������

  • ������������������������k���������
  • ���������������������������
  • ������������������
  • 上一篇:STL equal_range()的用法
    下一篇:获取virtualbox COM对象失败

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年04月14日 03时46分43秒