剑指offer 数字在排序数组中出现的次数
题目的意思很简单,统计一个有序数组中某个数出现的次数。这里联系一下两种二分写法。
第一种二分为返回数组中与key相同的第一个数。(例如 [1,2,2,2,3] key =2 返回的为1)。相对于传统的二分,要修改的地方在我们要保证a[mid] == key的时候,尝试想左边区间继续寻找,并让r=mid。代码如下:
int binSearchFirst(vector<int> a,int k) { int l = 0; int r = a.size()-1; while(r-l > 1) { int mid = (l+r)>>1; if(a[mid] >= k) r = mid; //相等的时候,继续去左子区间找是否有合适的解 else l = mid+1; //cout << "123" <<endl; } if(a[r] !=k && a[l] !=k) return -1; if(a[l] == k) return l; return r; }
第二种二分为找出key最后出现的位置。(例如[1,2,2,3,4] key =2 输出为2)。这里我们只需要保证a[mid] == key的时候,继续去右子区间看还有没有key代码如下:
int binSearchLast(vector<int>a ,int k) { int l = 0; int r = a.size()-1; while(r-l >1) { int mid = (l+r)>> 1; if(a[mid] <=k ) l=mid; else r =mid-1; } if(a[l] != k && a[l]!= k) return -1; if(a[r] == k) return r; return l; }