思路:如果从头到尾遍历数组,那时间复杂度是O(n).我们可以利用题目给出的条件,由于是排序数组,我们可以利用二分查找来实现 时间复杂度为O(log2N)
具体代码如下:
#include<iostream> #include<cassert> using namespace std; int findfirstk(int *ar, int len, int k, int start, int end)//利用二分查找找到第一个k出现的位置 { if(start > end) { return -1; } int mid = (end-start)/2 +start; if(ar[mid] == k) { if(mid>0&&ar[mid-1]!=k || mid==0)//找到第一个k { return mid; } else { end = mid - 1; } } else if(ar[mid] > k) { end = mid - 1; } else { start = mid + 1; } return findfirstk(ar, len, k, start, end); } int findlastk(int *ar, int len, int k, int start, int end)//利用二分查找找到最后一个k出现的位置 { if(start > end) { return -1; } int mid = (end-start)/2 +start; if(ar[mid] == k) { if(mid<len-1&&ar[mid+1]!=k || mid==len-1)//找到最后一个k { return mid; } else { start = mid + 1; } } else if(ar[mid] > k) { end = mid - 1; } else { start = mid + 1; } return findlastk(ar, len, k, start, end); } int gettimesk(int *ar, int len, int k) { assert(ar != NULL); int times = 0; int first = findfirstk(ar, len, k, 0, len-1); int last = findlastk(ar, len, k, 0, len-1); if(first>-1 && last>-1 && len>0) { times = last-first+1; } return times; } int main() { int ar[] = {1,2,3,4,4,5,6,6,6,6,6,7,7,7,7,8,8,9,9,9,9,9,10}; int len = sizeof(ar)/sizeof(ar[0]); int k; cin>>k; cout<<"数字 "<<k<<" 出现了 "<<gettimesk(ar, len, k)<<" 次"<<endl; return 0; }
时间: 2024-10-08 08:58:41