• 37、剑指offer--数字在排序数组中出现的次数


    题目描述
    统计一个数字在排序数组中出现的次数。
     
    解题思路:本题因为数组是有序的,因此采用二分查找的方式找到k,要知道k出现次数,先找到第一个k出现的位置,再找到最后一个k出现的位置,最后k出现次数为last-first+1
     1 class Solution {
     2 public:
     3     //通过二分法找到数组中第一个k出现位置
     4     int GetFirstK(vector<int> data,int length, int k, int start, int end)
     5     {
     6         if(start > end)
     7             return -1;
     8         int middleIndex = (start+end)/2;
     9         int middleData = data[middleIndex];
    10         if(middleData == k)
    11         {
    12             if((middleIndex > 0 && data[middleIndex-1] != k) || (middleIndex == 0))//middleIndex为第一个k位置
    13             {
    14                 return middleIndex;
    15             }
    16             else//在左侧
    17             {
    18                 end = middleIndex - 1;
    19             }
    20         }
    21         else if(middleData > k)
    22         {
    23             end = middleIndex - 1;
    24         }
    25         else
    26         {
    27             start = middleIndex + 1;
    28         }
    29         return GetFirstK(data,length,k,start,end);
    30     }
    31     //通过二分法找到数组中最后一个k出现位置
    32     int GetLastK(vector<int> data,int length, int k, int start, int end)
    33     {
    34         if(start > end)
    35             return -1;
    36         int middleIndex = (start+end)/2;
    37         int middleData = data[middleIndex];
    38         if(middleData == k)
    39         {
    40             if((middleIndex<length-1 && data[middleIndex+1] != k) || (middleIndex == length - 1))//恰为最后一个
    41             {
    42                 return middleIndex;
    43             }
    44             else
    45             {
    46                 start = middleIndex+1;
    47             }
    48         }
    49         else if(middleData > k)//左侧
    50         {
    51             end = middleIndex - 1;
    52         }
    53         else
    54         {
    55             start = middleIndex + 1;
    56         }
    57         return GetLastK(data,length,k,start,end);
    58     }
    59     int GetNumberOfK(vector<int> data ,int k)
    60     {
    61         int num = 0;
    62         int length = data.size();
    63         if(!data.empty() && length >0)
    64         {
    65             int first = GetFirstK(data,length,k,0,length-1);
    66             int last = GetLastK(data,length,k,0,length-1);
    67             if(first > -1 && last > -1)
    68             {
    69                 num = last - first + 1;
    70             }
    71         }
    72         return num;
    73     }
    74 };
  • 相关阅读:
    BUAA OO Unit1 表达式求导
    中介者模式
    命令模式
    观察者模式
    解释器模式
    策略模式
    迭代器模式
    模板方法模式
    代理模式
    桥接模式
  • 原文地址:https://www.cnblogs.com/qqky/p/7010292.html
Copyright © 2020-2023  润新知