zoukankan      html  css  js  c++  java
  • 二分查找

    数字在排序数组中出现的次数

    统计一个数字在排序数组中出现的次数,例如输入排序数组{0, 1, 2, 3, 4, 4, 4, 4, 5}和数字4,由于4在这个数组中出现了4次,因此输出4。(出自:剑指offer)

    既然输入的数组是排序的,那么很自然地就能想到用二分查找算法。

     1 #include <iostream>
     2 
     3 int getFirstK( int *data, int length, int k, int start, int end )
     4 {
     5     if ( start > end )
     6     {
     7         return -1;
     8     }
     9     int midIndex = ( end + start ) / 2;
    10     int midValue = data[ midIndex ];
    11     if ( midValue == k )
    12     {
    13         if ( ( midIndex > 0 && data[ midIndex - 1 ] != k ) || midIndex == 0 )
    14         {
    15             return midIndex;
    16         }
    17         else
    18         {
    19             end = midIndex - 1;
    20         }
    21     }
    22     else if ( midValue > k )
    23     {
    24         end = midIndex - 1;
    25     }
    26     else
    27     {
    28         start = midIndex + 1;
    29     }
    30     return getFirstK( data, length, k, start, end );
    31 }
    32 
    33 int getLastK( int *data, int length, int k, int start, int end )
    34 {
    35     if ( start > end )
    36     {
    37         return -1;
    38     }
    39     int midIndex = ( end + start ) / 2;
    40     int midValue = data[ midIndex ];
    41     if ( midValue == k )
    42     {
    43         if ( ( midIndex > 0 && data[ midIndex + 1 ] != k ) || midIndex == length - 1 )
    44         {
    45             return midIndex;
    46         }
    47         else
    48         {
    49             start = midIndex + 1;
    50         }
    51     }
    52     else if ( midValue > k )
    53     {
    54         end = midIndex - 1;
    55     }
    56     else
    57     {
    58         start = midIndex + 1;
    59     }
    60     return getLastK( data, length, k, start, end );
    61 }
    62 
    63 int getNumbersOfK( int *data, int length, int k )
    64 {
    65     int num = 0;
    66     if ( data != NULL || length > 0 )
    67     {
    68         int first = getFirstK( data, length, k, 0, length - 1 );
    69         int last = getLastK( data, length, k, 0, length - 1 );
    70         if ( first > -1 && last > -1 )
    71         {
    72             num = last - first + 1;
    73         }
    74     }
    75     return num;
    76 }
    77 
    78 int main()
    79 {
    80     int data[] = {0, 1, 2, 3, 4, 4, 4, 4, 5};
    81     int ret4 = getNumbersOfK( data, 9, 4);
    82     std::cout << "4 appear " << ret4 << " times in data." << std::endl;
    83     int ret6 = getNumbersOfK( data, 9, 6 );
    84     std::cout << "6 appear " << ret6 << " times in data." << std::endl;
    85 
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    请求接口时params和data的区别
    深拷贝
    react学习笔记---父子组件间值得传递
    表单验证自定义二选一
    vue数据复杂时的表单验证
    jq获取路径参数的方法
    删除对象中的元素的方法
    iOS的URL处理
    cocoapod的下载安装解释
    初探博客园
  • 原文地址:https://www.cnblogs.com/leealvin/p/3169710.html
Copyright © 2011-2022 走看看