思路: 应该是用二分查找分别找到该数字第一次和最后一次出现的位置,相减即可.O(logn) int findLeft(int a[], int n, int num) { , r = n - ; while(l <= r) { ; if(a[m] == num) //与普通二分查找的区别在等于这里 { || a[m - ] != num) //如果这是第一个数字或者它前面的数字不是num那么这个位置就是第一个num出现的位置 return m; else //否则num在左半部分 r = m -…
题目描述 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5} 和数字3,输出4. 思路如下 1. 预估时间复杂度,最复杂情况是,顺序扫描,统计K出现的次数,时间复杂度是o(n) 2. 使用类似2分查找,时间复杂度应该是o(logn).具体代码如下 class Solution{ public: int getNumberOfK(vector<int> &data, int begin, int end, int k) { int i = begin,…
题目: 统计一个数字在排序数组中出现的次数. 思路: 对二分查找进行改进,找到数字在数组中第一次出现和最后一次出现的位置,这样就得到它出现的次数. 以找第一次出现的位置为例:如果mid元素大于k,则在前半段找:如果小于k,则在后半段找:如果等于k,则要看mid的前一个元素是不是k,如果是,则在前半段找,如果不是,则这就是第一次出现的位置. 时间复杂度O(logn). 代码: class Solution { public: int GetNumberOfK(vector<int> data ,…