数字计算的有序排列的号码出现二分法

1. 问题叙述性说明

  在给定的一个已排序数组,查找出现一个指定的号码的数量。

如数组[1,2,3,4,4,4,4,6,8,9]于4发生的数4二级。


2. 思路与方法

  此问题能够在二分法的基础上进行改进。如果数组a为递增的数列,须要查找的数字为num。能够分别查找num在数组a中出现的起始位置和最后一次的位置。通过二者的差计算出数字num在数组a中出现的次数。
  c++代码例如以下:

#include <stdio.h>
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <set>
#include <vector>
#include <map>

using namespace std;

//查找指定数字在有序数组中出现的次数,isLeft标记最左和最右
int FindCntofNum(int a[],int len, int num, bool isLeft)
{
    int left = 0, right = len -1;

    int pos,mid;

    while(left <= right)//二分查找
    {
        mid = (left + right)/2;

        if( a[mid] < num )
        {
            left = mid +1;
        }
        else if(a[mid] > num)
        {
            right = mid -1;
        }
        else
        {
            pos = mid;

            if(isLeft)//查找最左值
            {
                right = mid -1;
            }
            else//查找最右值
            {
                left = mid +1;
            }
        }
    }
    return pos;//返回终于查找到的位置
}

int main()
{
    int a[10] = { 1,2,3,4,4,4,4,6,8,9};

    int left , right, dst = 4;

    left = FindCntofNum(a,10,4,true);
    right = FindCntofNum(a,10,4,false);

    printf("count of number %d : %d
",dst,right - left+1);

    return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

原文地址:https://www.cnblogs.com/zfyouxi/p/4801572.html