二分查找

来源:互联网 发布:java 内嵌类 编辑:程序博客网 时间:2024/05/12 18:12


数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数,例如输入排序数组{0, 1, 2, 3, 4, 4, 4, 4, 5}和数字4,由于4在这个数组中出现了4次,因此输出4。(出自:剑指offer)

既然输入的数组是排序的,那么很自然地就能想到用二分查找算法。

#include <iostream>int getFirstK( int *data, int length, int k, int start, int end ){if ( start > end ){return -1;}int midIndex = ( end + start ) / 2;int midValue = data[ midIndex ];if ( midValue == k ){if ( ( midIndex > 0 && data[ midIndex - 1 ] != k ) || midIndex == 0 ){return midIndex;}else{end = midIndex - 1;}}else if ( midValue > k ){end = midIndex - 1;}else{start = midIndex + 1;}return getFirstK( data, length, k, start, end );}int getLastK( int *data, int length, int k, int start, int end ){if ( start > end ){return -1;}int midIndex = ( end + start ) / 2;int midValue = data[ midIndex ];if ( midValue == k ){if ( ( midIndex > 0 && data[ midIndex + 1 ] != k ) || midIndex == length - 1 ){return midIndex;}else{start = midIndex + 1;}}else if ( midValue > k ){end = midIndex - 1;}else{start = midIndex + 1;}return getLastK( data, length, k, start, end );}int getNumbersOfK( int *data, int length, int k ){int num = 0;if ( data != NULL || length > 0 ){int first = getFirstK( data, length, k, 0, length - 1 );int last = getLastK( data, length, k, 0, length - 1 );if ( first > -1 && last > -1 ){num = last - first + 1;}}return num;}int main(){int data[] = {0, 1, 2, 3, 4, 4, 4, 4, 5};int ret4 = getNumbersOfK( data, 9, 4);std::cout << "4 appear " << ret4 << " times in data." << std::endl;int ret6 = getNumbersOfK( data, 9, 6 );std::cout << "6 appear " << ret6 << " times in data." << std::endl;return 0;}


原创粉丝点击