zoukankan      html  css  js  c++  java
  • 【剑指offer】数字在排序数组中出现的次数

    题目链接:数字在排序数组中出现的次数


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

     

    题解:暴力可过!但是。这题很明显不是让我们用暴力。既然是一个排序数组。自然想到二分。

    举例: 1 2 2 2 3

    二分第一次出现的位置,1;二分最后一次出现的位置:3;ans = last - first + 1

    二分的时候,一个总往前找,一个总往后找就行了

     

    代码:

     1 class Solution {
     2 public:
     3     int GetNumberOfK(vector<int> data ,int k) {
     4         int len = data.size();
     5         int cnt = 0;
     6         for(int i = 0; i < len ;i++){
     7             if(data[i] == k){
     8                 cnt++;
     9             }
    10         }
    11         return cnt;  
    12     }
    13 
    14 };
    15 
    16 OR
    17 
    18 class Solution {
    19 public:
    20     int GetNumberOfK(vector<int> data ,int k) {
    21         int first = BinSearch1(data,k);
    22         int last = BinSearch2(data,k);
    23         if(first == -1 || last == -1)    return 0;
    24         else    return (last - first + 1);
    25     }
    26     //第一次出现
    27     int BinSearch1(vector<int> data, int k){
    28         int len = data.size();
    29         int low = 0; int high = len-1;
    30         while(low <= high){
    31             int mid = (low+high)/2;
    32             if(data[mid] < k)    low = mid + 1;
    33             else if(data[mid] > k)    high = mid - 1;
    34             else {
    35                 if((data[mid-1] == k) && (mid-1 >= 0)){
    36                     high = mid-1;
    37                 }
    38                 else    return mid; 
    39            }
    40         }
    41         return -1;
    42     }
    43     //最后一次出现
    44     int BinSearch2(vector<int> data, int k){
    45         int len = data.size();
    46         int low = 0; int high = len - 1;
    47         while(low <= high){
    48             int mid = (low+high)/2;
    49             if(data[mid] < k)    low = mid + 1;
    50             else if(data[mid] > k)    high = mid - 1;
    51             else{ 
    52                 if((data[mid+1] == k) && (mid+1 < len)){
    53                     low = mid + 1;
    54                 }
    55                 else    return mid;
    56             }
    57         }
    58         return -1;
    59     }
    60 };
  • 相关阅读:
    Java 图片处理——如何生成高清晰度而占有磁盘小的缩略图
    Java文件IO操作应该抛弃File拥抱Paths和Files
    什么是内存(一):存储器层次结构
    mysql 锁
    Mysql索引面试题
    node.js中对同步,异步,阻塞与非阻塞的理解
    mysql 快照读 当前度
    mysql 联合索引
    redis 分布式锁(单机)
    docker 环境搭建redis集群相关问题
  • 原文地址:https://www.cnblogs.com/Asumi/p/12416646.html
Copyright © 2011-2022 走看看