O(lgn)时间内找出有序数组中某个元素出现的次数
来源:互联网 发布:telnet 端口号命令 编辑:程序博客网 时间:2024/05/17 18:24
题目:
找出有序数组中指定元素出现的次数,要求时间复杂度为O(lgn)
ex,
数组{0,0,0,2,3,3,3,3,3,4,5,5},0出现3次,3出现5次
思路:
很容易想到的一个办法是binary_search找到指定元素,然后左右查询,得到出现的次数k,但其时间复杂度为O(lgn)+k。
可通过改进binary_search,做两次查找,一次得到指定元素的起始出现位置,一次得到终止出现位置。
usingnamespace std;int binary_search_my(int arr[],int p,int q,int value,bool firstflag =true){int begin = p;int end = q;while(begin <= end) {int mid = (begin + end)/2;if(arr[mid] == value) {if(firstflag) {if(mid != p && arr[mid-1] != value)return mid;elseif(mid == p)return p;else end = mid - 1; }else {if(mid != q && arr[mid+1] != value)return mid;elseif(mid == q)return q;else begin = mid + 1; } }elseif(arr[mid] < value) begin = mid + 1;else end = mid - 1; }return -1;}int CountNumberOfOccurancesInSortedArr(int arr[],int n,int value){int last = binary_search_my(arr, 0, n-1, value,false);int first = binary_search_my(arr, 0, n-1, value,true);if(last == -1 && first == -1)return 0;elsereturn last - first + 1;}int main(){int arr[] = {0,0,0,2,3,3,3,3,3,4,5,5};int nsize =sizeof(arr)/sizeof(int); copy(arr, arr+nsize, ostream_iterator<int>(cout,"/t")); cout<<endl; cout<<"Count number of 0: "<<(CountNumberOfOccurancesInSortedArr(arr, nsize, 0))<<endl; cout<<"Count number of 3: "<<(CountNumberOfOccurancesInSortedArr(arr, nsize, 3))<<endl; cout<<"Count number of 5: "<<(CountNumberOfOccurancesInSortedArr(arr, nsize, 5))<<endl; cout<<"Count number of 2: "<<(CountNumberOfOccurancesInSortedArr(arr, nsize, 2))<<endl; cout<<"Count number of 1: "<<(CountNumberOfOccurancesInSortedArr(arr, nsize, 1))<<endl;return 0;}
0 0
- O(lgn)时间内找出有序数组中某个元素出现的次数
- O(lgn)时间内找出有序数组中某个元素出现的次数
- 面试题精选(86):O(lgn)时间内找出有序数组中某个元素出现的次数
- 找出有序元素数组中指定元素出现的次数
- 主元素问题(判断数组是否出现主元素,O(n)时间内找出主元素,主元素出现次数)
- 有序数组中找出给定数字的出现次数
- 找出key在有序数组中出现的次数
- 在有序数组中,统计某一元素出现的次数
- 找出一个数组中出现次数超过一半的元素
- 找出数组中某个元素第一次出现的位置
- 有序数组找到出现次数最高的元素和次数
- 编写程序,在O(n)时间内从数组x[0..n-1]中找出第k个最小的元素?
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- Java实现 找出数组中出现次数超过数组长度一半的元素
- 找出数组中出现次数超过数组长度一半的元素
- 编程之美-最短摘要
- effective C++笔记
- C++ STL 学习笔记
- 深入理解C++中的mutable关键字
- 字符串 前 L的含义
- O(lgn)时间内找出有序数组中某个元素出现的次数
- VC、VS2005调试技巧
- VC里面的Error spawning link.exe 或者cl.exe
- 如何提高程序效率
- 两数组包含问题
- x210ii DM9000驱动调试成功-基于x210ii/s5pv210开发板
- 使序列有序的最少交换次数(minimum swaps)
- 不要再吹水地球人听不懂的技术,咱来点干货
- HTTP协议漫谈