O(lgn)时间内找出有序数组中某个元素出现的次数
2017-02-22 07:11
507 查看
题目:
找出有序数组中指定元素出现的次数,要求时间复杂度为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,做两次查找,一次得到指定元素的起始出现位置,一次得到终止出现位置。
找出有序数组中指定元素出现的次数,要求时间复杂度为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; else return 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)时间内找出有序数组中某个元素出现的次数
- 面试题精选(86):O(lgn)时间内找出有序数组中某个元素出现的次数
- 在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。
- 主元素问题(判断数组是否出现主元素,O(n)时间内找出主元素,主元素出现次数)
- 找出有序元素数组中指定元素出现的次数
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- Java实现 找出数组中出现次数超过数组长度一半的元素
- 找出数组里面元素出现次数最多的问题
- 如何在时间复杂度为O(n),空间复杂度为O(1)的条件下,统计数组中不同元素出现的次数
- 有序数组中找出给定数字的出现次数
- 算法 n大小的数组中找出出现3/n次数以上的元素
- 求一个长度为n的整型有序数组中是否有出现次数超过n/2的元素
- 找出和值等于指定值的元素,如有序数组{1,2,6,23,43,64},求和等于25的两个和数则将是元素2和23,时间复杂度是0(n)。
- 找出数组里面元素出现次数最多的问题
- 统计数组中不同元素出现的次数(时间复杂度O(n),空间复杂度o(1))
- 剑指Offer:找出数组中出现次数超过一半的元素
- 找出数组中出现次数超过数组长度一半的元素
- 如何在O(n)的时间复杂度内找出数组中出现次数超过了一半的数
- 找出一个数组中出现次数超过一半的元素
- 统计数组中不同元素出现的次数(时间复杂度O(n),空间复杂度o(1))