zoukankan      html  css  js  c++  java
  • 数字在排序数组中出现的次数

    统计一个数字在排序数组中出现的次数。例如输入{2,2,2,2,2,3,5,5}和数字2,输出5.

    常规的顺序扫描法时间复杂度是O(n),可以进一步优化。用二分查找的方法进行查找可以把时间复杂度降为O(logn)。

    代码如下:

     1 int GetFirstK(int* data, int length, int k, int start, int end)//用二分查找法找到第一个K的位置
     2 {
     3     if (start > end)
     4     {
     5         return -1 ;
     6     }
     7     int MidIndex = (start + end) / 2 ;
     8     int MidData = data[MidIndex];
     9     if (MidData == k)
    10     {
    11         if (MidIndex == 0 || MidIndex > 0 && data[MidIndex - 1] != k)//在首位或是不在首位且前一位不是K时
    12         {
    13             return MidIndex ;
    14         }
    15         else //不是第一个K时
    16         {
    17             end = MidIndex - 1 ;
    18         }
    19     }
    20     else if ( MidData > k)
    21     {
    22         end = MidIndex - 1 ;
    23     }
    24     else
    25     {
    26         start = MidIndex + 1 ;
    27     }
    28     return GetFirstK(data, length, k, start, end) ;
    29 }
    30 
    31 int GetLastK(int* data, int length, int k, int start, int end)//用二分查找法找到最后一个K的位置
    32 {
    33     if (start > end)
    34     {
    35         return -1 ;
    36     }
    37     int MidIndex = (start + end) / 2 ;
    38     int MidData = data[MidIndex];
    39     if (MidData == k)
    40     {
    41         if (MidIndex == length - 1 || MidIndex < length - 1 && data[MidIndex + 1] != k)//在末位或是不在末位且后一位不是K时
    42         {
    43             return MidIndex ;
    44         }
    45         else  //不是最后一个K时
    46         {
    47             start = MidIndex + 1 ;
    48         }
    49     }
    50     else if ( MidData > k)
    51     {
    52         end = MidIndex - 1 ;
    53     }
    54     else
    55     {
    56         start = MidIndex + 1 ;
    57         
    58     }
    59 
    60     return GetLastK(data, length, k, start, end) ;
    61 
    62 }
    63 int GetNumberOfK(int* data, int length, int k)//得到K的个数
    64 {
    65     if (!data || length < 1)
    66     {
    67         return 0 ;
    68     }
    69     int first = GetFirstK(data, length, k, 0, length - 1);
    70     int last = GetLastK(data, length, k, 0, length - 1);
    71     int number = 0 ;
    72     if (first != -1 && last != -1)
    73     {
    74         number = last - first + 1 ;
    75     }
    76     return number ;
    77 }
  • 相关阅读:
    对搜狗浏览器的评价
    领扣(LeetCode)二叉树的所有路径 个人题解
    领扣(LeetCode)单词模式 个人题解
    领扣(LeetCode)最长公共前缀 个人题解
    领扣(LeetCode)设计哈希映射 个人题解
    领扣(LeetCode)寻找旋转排序数组中的最小值 个人题解
    领扣(LeetCode)最长和谐子序列 个人题解
    领扣(LeetCode)删除注释 个人题解
    领扣(LeetCode)检测大写字母 个人题解
    领扣(LeetCode)第三大的数 个人题解
  • 原文地址:https://www.cnblogs.com/csxcode/p/3734434.html
Copyright © 2011-2022 走看看