O(lgn)时间内找出有序数组中某个元素出现的次数
来源:互联网 发布:linux分辨率代码 编辑:程序博客网 时间:2024/05/17 17:16
题目:
找出有序数组中指定元素出现的次数,要求时间复杂度为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;}
- 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实现 找出数组中出现次数超过数组长度一半的元素
- 找出数组中出现次数超过数组长度一半的元素
- Hadoop NameNode单点问题解决方案之一 AvatarNode
- shell_sort
- CC++常用函数查寻表
- RAC在AIX上的安装
- 过滤器(Fileter)执行流程
- O(lgn)时间内找出有序数组中某个元素出现的次数
- 【redhat5.5】SELinux的基本配置和使用思路
- 启动数据库SQL Server Service Broker
- Oracle行锁定之存储过程
- Please change your current directory to a writable directory preferably outside of MATLAB installati
- iphone和http服务器的通信
- java.lang.illegalAccessError
- 用mini2440烧写spiflash『上』
- 第八周实验报告3