zoukankan      html  css  js  c++  java
  • 面试题38_数字在排序数组中出现的次数

    题目描写叙述

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

    解题思路

    数组是排序的,所以反复出现的数字是相邻排列的。

    用二分查找算法,找到第一次出现的位置。和 最后一次出现的位置。

    推断第一次出现的位置条件为:当前数字的前一个是否与之相等。若是则继续查找,否则该位置就是第一次出现的位置。

    推断最后一次出现的位置条件为:当前数字的后一个是否与之相等,若是则继续查找,否则该位置就是最后一次出现的位置。


    出现的次数= last - first +1


    时间复杂度:O(logn)


    实现代码

    
    class Solution {
    public:
        int GetNumberOfK(vector<int> data ,int k) {
            int result=0;
            
            if(data.empty())
                return 0;
            int start = 0;
            int end = data.size()-1;
            
            int first = getFirstK(data,k,start,end);
            int last = getLastK(data,k,start,end);
            
            if(first >-1 && last >-1)
                result = last - first+1;
            
            return result;
        }
        
        int getFirstK(vector<int> data, int k, int start, int end)
        {
            if(start > end)
                return -1;
            int midIndex = (start + end)/2;
            int midData = data[midIndex];
            
            if(midData == k)
            {
             	if(midIndex > 0 && data[midIndex-1] != k || midIndex == 0)
                    return midIndex;
                else
                    end = midIndex-1;
            }
            else if(midData > k)
                end = midIndex-1;
            else
                start = midIndex+1;
                
            return getFirstK(data,k,start,end);
        }
        
        int getLastK(vector<int> data, int k, int start, int end)
        {
            if(start > end)
                return -1;
            int midIndex = (start + end)/2;
            int midData = data[midIndex];
            
            if(midData == k)
            {
             	if(midIndex < data.size()-1 && data[midIndex+1] != k || midIndex == data.size()-1)
                    return midIndex;
                else
                    start = midIndex+1;
            }
            else if(midData > k)
                end = midIndex-1;
            else
                start = midIndex+1;
                
            return getLastK(data,k,start,end);
        }
    };
    
    
    
    
    





  • 相关阅读:
    unity vscode 断点问题
    unity Prefab 序列化一个小问题。
    公司有同事中病毒
    有点愧疚,今天把unity官方骗了...
    网络处理,发送约定
    (转载)MonoBehaviour的事件和具体功能总结
    控制台输出乱码问题
    vs遇到的字符串问题
    cmake的下载和安装
    三消设计思路, 通过配置文件搞定一切。
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6748762.html
Copyright © 2011-2022 走看看