面试题38:数字在排序数组中出现的次数
2015-04-28 12:01
393 查看
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数字中出现了4次,因此输出4。
算法思路:因为数组有序,利用二分查找的思想,先找出第一次出现的位置first,再找出最后一次出现的位置last,然后用last-first+1就是出现的次数。
算法思路:因为数组有序,利用二分查找的思想,先找出第一次出现的位置first,再找出最后一次出现的位置last,然后用last-first+1就是出现的次数。
#include <iostream> using namespace std; //查找K第一次出现的位置 int GetFirstK(int * data,int length,int k ,int start,int end) { if(start>end) return -1; int mid=(start+end)/2; //如果中间的数等于k if(data[mid]==k) { //如果mid不为0并且前面那个值不为K,或者mid是第一个数字说明K第一次出现 if((mid>0&&data[mid-1]!=k)||mid==0) { return mid; } //否则K第一次出现的位置应该在mid左边,向前查找 end=mid-1; } else if(data[mid]>k) { //如果当前值大于K,说明K在mid之前 end=mid-1; } else { start=mid+1; } return GetFirstK(data,length,k,start,end); } //查找K最后一次出现的位置 int GetLastK(int * data,int length,int k ,int start,int end) { if(start>end) return -1; int mid=(start+end)/2; //如果中间的数等于k if(data[mid]==k) { //如果mid不为0并且后面那个值不为K,或者mid是最后一个数字说明K最后一次出现 if((mid<end&&data[mid+1]!=k)||mid==end) { return mid; } //否则K最后一次出现的位置应该在mid右边,向前查找 start=mid+1; } else if(data[mid]>k) { //如果当前值大于K,说明K在mid之前 end=mid-1; } else { start=mid+1; } return GetLastK(data,length,k,start,end); } int GetNumberOfK(int * data,int length,int k) { int number=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) { number=last-first+1; } } return number; } int main() { int data[]={1,2,3,3,3,3,4,5}; cout<<GetNumberOfK(data,8,3)<<endl; return 0; }
相关文章推荐
- 剑指offer 面试题38 数字在排序数组中出现的次数
- 面试题38_数字在排序数组中出现的次数
- 面试题38 数字在排序数组中出现的次数
- 面试题 38: 数字在排序数组中出现的次数
- 剑指offer-面试题38 : 数字在排序数组中出现的次数
- 剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)
- 面试题38—数字在排序数组中出现的次数
- 剑指Offer面试题37两个链表的第一个公共结点,面试题38数字在排序数组中出现的次数
- 面试题38:数字在排序数组中出现的次数
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 《剑指Offer》学习笔记--面试题38:数字在排序数组中出现的次数
- [剑指offer][面试题38]数字在排序数组中出现的次数
- 面试题38 数字在排序数组找那个出现的次数
- 面试题38:数字在排序数组中出现的次数
- 剑指offer面试题38 数字在排序数组中出现的次数
- 剑指offer--面试题38:数字在排序数组中出现的次数
- 剑指offer-面试题38-数字在排序数组中出现的次数
- 剑指offer-面试题38-数字在排序数组中出现的次数
- 剑指Offer系列-面试题38:数字在排序数组中出现的次数
- (剑指Offer)面试题38:数字在排序数组中出现的次数