<剑指Offer>面试题53(1): 数字在排序数组中出现的次数

题目描述

  • 统计一个数字在排序数组中出现的次数
  • 例如,输入排序数组 {1,2,3,3,3,3,4,5} 和数字 3,由于 3 在这个数组中出现了 4 次,因此输出 4

题目解读

  • 剑指Offer 264

代码

#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    int GetFirstOfK(vector<int>& data, int left, int right, int k){
        if(left <= right){
            int index = (left + right) >> 1;
            int mid = data[index];

            if(k < mid){
                right = index-1;
            }
            else if(k > mid){
                left = index+1;
            }
            else{ // k == mid

                if((index == 0) || (index > 0 && data[index-1] != k)){
                    return index;
                }
                else{
                    right = index-1;
                }
            }
            return GetFirstOfK(data, left, right, k);

        }
        else{
            return -1;
        }
    }

    int GetLastOfK(vector<int>& data, int length, int left, int right, int k){
        if(left <= right){
            int index = (left + right) >> 1;
            int mid = data[index];

            if(k < mid){
                right = index-1;
            }
            else if(k > mid){
                left = index+1;
            }
            else{ // k == mid

                if((index == length) || (index < length && data[index+1] != k)){
                    return index;
                }
                else{
                    left = index+1;
                }
            }
            return GetLastOfK(data, length, left, right, k);

        }
        else{
            return -1;
        }
    }

    int GetNumberOfK(vector<int> data ,int k) {
        int length = data.size();
        if(length == 0){
            return 0;
        }

        int first = GetFirstOfK(data, 0, length-1, k);
        int last  = GetLastOfK(data, length-1, 0, length-1, k);

        if(first != -1 && last != -1){
            return last - first + 1;
        }
        return 0;
    }
};


int main(){
    Solution ss;
    int a[10] = {1, 2, 3, 3, 3, 3, 4, 5};
    vector<int> data;
    for(int i=0; i < 8; i++){
        data.push_back(a[i]);
    }
    cout<<ss.GetNumberOfK(data, 3);
}

总结展望

  • 二分查找的经典应用.
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容