zoukankan      html  css  js  c++  java
  • 数字在排序数组中出现的次数

    题目描述

    统计一个数字在排序数组中出现的次数。
    思路:排序数组即排好序的数组,对于排好序的数组,我们就会想到二分法,
        本题就是用二分法查找到值,则返回下标,再在此值左右两边计数查找。
    代码:
    int BinarySearch(vector<int> data,int low,int high,int k)
        {
            while(low <= high)
            {
                int m = low + (high-low)/2;
                if(data[m] == k)
                     return m;
                else if(data[m] > k)
                    high = m-1;
                else
                    low = m+1;
            }
            return -1;
        }
        int GetNumberOfK(vector<int> data ,int k) {
            int len = data.size();
            int index ;
            index = BinarySearch(data,0,len-1,k);
            if(index == -1)
                return 0;
            int low = index-1;
            int n1 = 0;
            int n2 = 0;
            int high = index+1;
            while((low >= 0) && (data[low] == k))
            {
                low--;
                n1++;
            }
            while((high<len) && (data[high] == k))
            {
                high++;
                n2++;
            }
            return n1+n2+1;
        }

    看到的特别的想法:

    思路:例如:样例 1,2,4,4,5,6   查找4的个数,则把3.5和4.5插入,1, 2, 3.5, 4, 4, 4.5, 5, 6  则4.5的位置减去3.5的位置就是4的个数。

    但是这种方法在元素少的时候不如上一个方法的时间复杂度。因为要调用两次二分。

        int GetNumberOfK(vector<int> data ,int k) {
            return biSearch(data, k+0.5) - biSearch(data, k-0.5) ;
        }
        int biSearch(const vector<int> & data, double num){
            int s = 0, e = data.size()-1;     
            while(s <= e){
                int mid = (e - s)/2 + s;
                if(data[mid] < num)
                    s = mid + 1;
                else if(data[mid] > num)
                    e = mid - 1;
            }
            return s;
        }

    两个方法的比较:

     复杂度差不多,但是第一种方法最坏复杂度更高,最好复杂度更低,不够稳定。
    双二分的比较稳定,但是元素少的时候效率不如第一种 。
     
  • 相关阅读:
    阿里P7架构师是如何解决跨域问题的!你有遇到吗?
    Node.js Express 框架
    用户管理 之 Linux 系统中的超级权限的控制
    [转] Exchange 2013 安装部署详解
    Clustered和Nonclustered Indexes 各自得特点和区别及长短处
    配置IIS5.5/6.0 支持 Silverlight
    redis模块使用
    redis介绍及安装
    linux上安装redis、远程配置及开机启动
    远程连接linux、配置SSHD
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/9128672.html
Copyright © 2011-2022 走看看