• 剑指offer——56在排序数组中查找数字


    题目描述

    统计一个数字在排序数组中出现的次数。
     
    题解:
      使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了
      但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N)的复杂度
      可以再次利用二分法,在第一次找到k的左半部分使用二分法找到不再出现k的位置,其右半部份类似。
      
     1 class Solution01 {
     2 public:
     3     int GetNumberOfK(vector<int> data, int k) {
     4         if (data.size() == 0)return 0;
     5         int L = 0, R = data.size() - 1, M;
     6         while (L <= R)
     7         {
     8             M = (R - L) / 2 + L;
     9             if (data[M] == k)break;
    10             else if (data[M] > k)R = M - 1;
    11             else L = M + 1;
    12         }
    13         if (L > R)return 0;
    14         L = R = M;
    15         int res = 0;
    16         while (L >= 0 && data[L] == k) {
    17             res++; --L;
    18         }
    19         while (R<data.size() && data[R] == k) {
    20             res++; ++R;
    21         }
    22         return res - 1;
    23     }
    24 };
    25 
    26 class Solution02 {
    27 public:
    28     int GetNumberOfK(vector<int> data, int k) {
    29         if (data.size() == 0)return 0;
    30         int pM = find(data, 0, data.size() - 1, k);
    31         if (data[pM] != k)return 0;
    32         int pL = pM, pR = pM;
    33         while (pL !=-1 && data[pL] == k) pL = find(data, 0, pL - 1, k);
    34         while (pR != -1 && data[pR] == k) pR = find(data, pR + 1, data.size() - 1, k);
    35         return (pR == -1 ? data.size() : pR) - pL - 1;
    36     }
    37     int find(const vector<int>data, int L, int R, const int k)
    38     {
    39         int M = -1;
    40         while (L >= 0 && R < data.size() && L <= R)
    41         {
    42             M = (R - L) / 2 + L;
    43             if (data[M] == k)break;
    44             else if (data[M] > k)R = M - 1;
    45             else L = M + 1;
    46         }
    47         return M;
    48     }
    49 };
  • 相关阅读:
    [BZOJ3530][SDOI2014]数数
    [Luogu3121][USACO15FEB]审查Censoring
    [BZOJ1212][HNOI2004]L语言
    [Luogu3041][USACO12JAN]视频游戏的连击Video Game Combos
    AC自动机总结
    (三)LDAP 新增用户
    (二) LDAP 安装
    (一)LDAP 简介
    (十三)VMware Harbor 身份验证模式
    loj#2541. 「PKUWC2018」猎人杀
  • 原文地址:https://www.cnblogs.com/zzw1024/p/11706308.html
Copyright © 2020-2023  润新知