• (算法:二分查找)在排序数组中,找出给定数字出现的次数


    题目:

    在排序数组中,找出给定数字出现的次数

    思路:

    既然出现排序数组,很容易想到二分查找,时间复杂度为O(logn);

    先通过二分查找找到最左边出现该数字的下标left(如果没找到,则返回-1),然后通过二分查找找到最右边出现该数字的下表right(如果没找到,则返回-1),然后right-left+1就是出现的次数;

    代码:

    #include <iostream>
    
    using namespace std;
    
    int BinarySearchCount(int *array,int len,int data){
        if(len<1) return -1;
        int left=0;
        int right=len-1;
        int mid;
        int leftIndex=-1;
    
        // find the left index
        while(left<=right){
            mid=left+((right-left)>>1);
            if(array[mid]==data){
                leftIndex=mid;
                right=mid-1;
            }
            else if(array[mid]<data)
                left=mid+1;
            else
                right=mid-1;
        }
    
        // find the right index
        left=0;
        right=len-1;
        int rightIndex=-1;
        while(left<=right){
            mid=left+((right-left)>>1);
            if(array[mid]==data){
                rightIndex=mid;
                left=mid+1;
            }
            else if(array[mid]<data)
                left=mid+1;
            else
                right=mid-1;
        }
    
        if(leftIndex!=-1 && rightIndex!=-1)
            return rightIndex-leftIndex+1;
        else
            return 0;
    }
    
    int main()
    {
        int arr[]={0,1,2,3,3,3,3,3,3,3,4,5,6,7,13,19};
        int len=sizeof(arr)/sizeof(arr[0]);
        cout << BinarySearchCount(arr,len,18) << endl;
        return 0;
    }
  • 相关阅读:
    bzoj 2832
    洛谷5月月赛
    P4705 玩游戏
    【bzoj4817】[Sdoi2017]树点涂色&&bzoj3779-重组病毒
    A
    P4715 「英语」Z 语言
    P4714 「数学」约数个数和
    P2860 [USACO06JAN]冗余路径Redundant Paths
    【BZOJ3252】攻略
    BZOJ 1706
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4715409.html
Copyright © 2020-2023  润新知