(1)查找有序数组,首先考虑使用二分查找,使时间复杂度为O(log n)。更改二分查找的条件,不断缩小区间,直到区间头和区间尾均为k时停止,计算得到区间长度。O(n*log(n))。
(2)两行代码就搞定,就是用C++ stl里面的lower_bound和upper_bound,lower_bound是找出不小于即大于等于的第一个数的下标 ;upper_bound是找出大于的第一个数的下标。
(1)
1 class Solution { 2 public: // 二分查找 O(log n) 3 int GetNumberOfK(vector<int> data ,int k) { 4 if (data.size() <=0) 5 return 0; 6 int count = 0; 7 int begin = 0; 8 int end = data.size()- 1; 9 10 while (begin<=end){ 11 int mid = (begin + end) /2; 12 if (data[begin]==k && data[end] == k) 13 break; 14 15 // 缩小start和end的范围,使start指向第一个k,end指向最后一个k 16 if (data[begin] < k) 17 ++begin; 18 if (data[end] > k) 19 --end; 20 21 if (data[mid]< k){ 22 end = mid -1; 23 } else if (data[mid] > k){ 24 begin = mid +1; 25 } 26 } 27 if (data[begin] ==k && data[end]==k) 28 return end - begin +1 ; // beg和end分别对应第一个和最后一个k所在位置 29 else 30 return 0; // beg>end 不存在该元素 31 32 } 33 };
(2)
1 class Solution 2 { 3 public: 4 int GetNumberOfK(vector<int> data ,int k) 5 { 6 int s1 = lower_bound(data.begin(),data.end(),k)-data.begin(); 7 int s2 = upper_bound(data.begin(),data.end(),k)-data.begin(); 8 //cout<<s1<<" "<<s2<<endl; 9 return s2-s1; 10 } 11 };
https://blog.csdn.net/zjwreal/article/details/88774692
原文:https://www.cnblogs.com/wxwhnu/p/11421309.html