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);
        }
    };
    
    
    
    
    





  • 相关阅读:
    Animation
    Calendar
    ToggleButton
    ASP.NET备份恢复SqlServer数据库
    ConfirmButton
    DropDown
    备份与恢复ACCESS数据库
    PopupControl
    CascadingDropDown
    RoundedCorners
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6748762.html
Copyright © 2011-2022 走看看