劍指offer之統計一個數字在排序陣列中出現的次數。
阿新 • • 發佈:2018-10-31
1.題目描述
統計一個數字在排序陣列中出現的次數。
2.問題分析
方法一:
因為是排序的陣列,首先在陣列中找到第一個值為k的位置begin,之後從begin找下一個不等於值k的位置end,則,次數為end - begin。
例如:1 2 2 3 3 3 5,k = 3,則begin = 3,end = 6,則次數是 end - begin = 3.
方法二:
因為是排序的陣列,通過二分查詢法查詢到陣列中一個值為k的座標,之後從該位置,分別向左,右移動第一個不為k值的位置。
例如:1 2 2 3 3 3 5,k = 3,假設找到的下標是4,則使用一個begin = index,end = index,begin向左移動,直到所指的值不為3,即:begin = 2; 同理,end向右移動,直到所指的值不為3,即end = 6,那麼次數是: end - begin -1 = 3.
3.原始碼
方法一:
int GetNumberOfK(vector<int> data ,int k)
{
int size = data.size();
if(size == 0)
return 0;
int begin = 0;
while(begin < size && data[begin] != k) ++begin;
int end = begin;
while(end < size && data[ end] == k) ++end;
return end - begin;
}
方法二:
int findIndexOfK(vector<int>& data, int k,int begin, int end)
{
if(begin > end)
return -1;
int mid = (end - begin) / 2 + begin;
if(k == data[mid])
return mid;
else if(k > data[mid])
return findIndexOfK(data,k,mid + 1,end);
else
return findIndexOfK(data,k,begin,mid - 1);
}
int GetNumberOfK(vector<int> data ,int k)
{
int size = data.size();
if(size == 0)
return 0;
int index = findIndexOfK(data, k, 0, size - 1);
if(index == -1)
return 0;
int begin = index,end = index;
while(begin >= 0 && data[begin] == data[index]) --begin;
while(end <= size - 1 && data[end] == data[index]) ++end;
return end - begin - 1;
}