zoukankan      html  css  js  c++  java
  • 剑指offer-面试题53_1-在排序数组中查找数字-二分查找

    /*
    题目:
    	统计一个数字在排序数组中出现的次数。
    */
    /*
    思路:
    	1、从前往后遍历,时间复杂度O(n)。
    	2、二分查找到目标数字target,向前向后遍历,时间复杂度O(n)。
    	3、利用二分法,递归找到数字出现的第一个位置和最后一个位置,时间复杂度O(logn)。
    */
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    #include<map>
    
    
    using namespace std;
    
    int getFirstOfK(vector<int> &A,int start,int end, int target){
        if(start > end) return -1;
    
        int mid = (start + end) / 2;
        if(A[mid] > target){
            return getFirstOfK(A,start,mid-1,target);
        }else if(A[mid] < target){
            return getFirstOfK(A,mid+1,end,target);
        }else{
            if(mid == 0 || A[mid-1] != target){
                return mid;
            }else{
                return getFirstOfK(A,start,mid-1,target);
            }
        }
    }
    
    int getLastOfK(vector<int> &A,int start,int end,int target){
        if(start > end) return -1;
    
        int mid = (start+end) / 2;
        if(A[mid] > target){
            return getLastOfK(A,start,mid-1,target);
        }else if(A[mid] < target){
            return getLastOfK(A,mid+1,end,target);
        }else{
            if(mid == end || A[mid+1] != target){
                return mid;
            }else{
                return getLastOfK(A,mid+1,end,target);
            }
        }
    }
    
    int getNumbersOfK(vector<int> &A, int target){
        int first = getFirstOfK(A,0,A.size()-1,target);
        int last = getLastOfK(A,0,A.size()-1,target);
    
        if(last != -1 && first != -1){
            return last - first + 1;
        }
        return 0;
    
    }
    
    int main(){
       vector<int> a = {1,1,3,4,4,4,5};
       cout<<getNumbersOfK(a,1);
    }
    

       

  • 相关阅读:
    第8章 字符串
    第7章 方法
    第6章 类和对象
    第5章 数组
    第4章 循环结构、break与continue
    第3章 选择结构
    第2章 变量、数据类型和运算符
    Codeforces Round #426 (Div. 2)
    CCNA学前基础一
    Tinkoff Challenge
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/12088286.html
Copyright © 2011-2022 走看看