• 剑指offer:数字在排序数组中出现的次数


    题目描述:

    统计一个数字在排序数组中出现的次数。

    思路分析:

    1. 直观思路是直接遍历一遍,统计。复杂度也只要O(n)。

    2. 显然这道题要考察的内容不这么简单,实际上考虑二分的思想来完成。分别二分查找第一个k和最后一个k。具体来说,利用二分查找思想,找到k,再判断当前的前一个是否为k或是否为第一个元素,若是,则返回;否则即第一个k在前面,则右边界r左移,继续递归查找。对于最后一个k的查找思路类似。

    代码:

    思路二:

     1 class Solution {
     2 public:
     3     int GetFirstK(vector<int>data, int k, int l, int r)
     4     {
     5         if(l>r)
     6             return -1;
     7         int mid = (l+r)/2;
     8         if(data[mid]>k)
     9         {
    10             r = mid-1;
    11         }
    12         else if(data[mid]<k)
    13         {
    14             l = mid+1;
    15         }
    16         else
    17         {
    18             if((mid>0 && data[mid-1]!=k) || mid==0)
    19                 return mid;
    20             else
    21                 r = mid-1;
    22         }
    23         return GetFirstK(data, k, l, r);
    24     }
    25     int GetLastK(vector<int>data, int k, int l, int r)
    26     {
    27         if(l>r)  //递归出口
    28             return -1;
    29         int mid = (l+r)/2;
    30         if(data[mid]>k)
    31         {
    32             r = mid - 1;
    33         }
    34         else if(data[mid]<k)
    35         {
    36             l = mid + 1;
    37         }
    38         else
    39         {
    40             if((mid<data.size()-1&&data[mid+1]!=k) || mid == data.size()-1 )
    41                 return mid;
    42             else
    43                 l = mid+1;
    44         }
    45         return GetLastK(data, k, l, r);
    46     }
    47     int GetNumberOfK(vector<int> data ,int k) {
    48         if(data.size()<=0)
    49             return 0;
    50         int first = GetFirstK(data, k, 0, data.size()-1);
    51         int last = GetLastK(data, k, 0, data.size()-1);
    52         if(first==-1 && last ==-1)
    53             return 0;
    54         else
    55             return last-first+1;
    56     }
    57 };
  • 相关阅读:
    Django【十五】pillow模块使用
    Django【十四】内置的anth认证
    Django【十三】form组件。
    Django【十二】中间价
    Django【十一】cookie-sesson
    Django【十】Ajax
    Django【八】多表操作
    Django【九】事务和锁
    python协程
    python多线程
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10959963.html
Copyright © 2020-2023  润新知