zoukankan      html  css  js  c++  java
  • 数字计算的有序排列的号码出现二分法

    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;
    }
    

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

  • 相关阅读:
    BKDRHash函数
    poj3261Milk Patterns 后缀数组
    两圆相交面积
    后缀数组模板
    kmp模板 && 扩展kmp模板
    hdu 2594 Simpsons’ Hidden Talents
    BZOJ 1911 特别行动队(斜率优化DP)
    BZOJ 1898 沼泽鳄鱼(矩阵快速幂)
    BZOJ 1996 合唱队(DP)
    BZOJ 1821 部落划分(二分+并查集)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4801572.html
Copyright © 2011-2022 走看看