知识点:数组、二分查找
一、题目
统计一个数字在排序数组中出现的次数。
二、思路
1:暴力法,直接遍历数组,统计数字k在数组data中出现的次数
C++:
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
//暴力法,直接顺序遍历数组,统计k在数组data中出现的次数
int times = 0;
for(int i=0; i<data.size(); i++){
if(data[i] == k){
times++;
}
}
return times;
}
};
方法2:二分法查找,对于排序数组,首先想到二分法
分别使用二分查找找到数字k在数组data中出现的第一个位置firstIndex和最后一个位置lastIndex,则k出现的次数为
(lastIndex - firstIndex + 1)
C++:
class Solution {
public:
int GetFirstIndex(vector<int> &data,int k,int begin,int end){
//获取k在data中出现的第一个位置
//递归的条件begin<=end,当不满足时,设置返回-1
if(begin > end){
return -1;
}
int middleIndex = (begin + end) >> 1;
int middleData = data[middleIndex];
if(middleData == k){
//接着判断是不是第一次出现
if(middleIndex == 0 || (middleIndex > 0 && data[middleIndex-1]!= k)){//第一次出现的条件,2种cases
return middleIndex;
}
else{
end = middleIndex - 1;
}
}
else if(middleData < k){//在右半段区间查找k
begin = middleIndex + 1;
}
else{//在左半段区间查找k
end = middleIndex - 1;
}
//迭代寻找第一个k出现的位置
return GetFirstIndex(data,k,begin,end);
}
int GetLastIndex(vector<int> &data,int k,int begin,int end){
//获取k在data中出现的最后一个位置
if(begin > end){
return -1;
}
int length = data.size();
int middleIndex = (begin + end) >> 1;
int middleData = data[middleIndex];
if(middleData == k){
//判断是不是最后一次出现
if(middleIndex == length-1 || (middleIndex < length-1 && data[middleIndex+1]!= k)){//最后一次出现的条件,2种cases
return middleIndex;
}
else{
begin = middleIndex + 1; //与第一次出现不同
}
}
else if(middleData < k){//在右半段区间查找k
begin = middleIndex + 1;
}
else{//在左半段区间查找k
end = middleIndex - 1;
}
//递归
return GetLastIndex(data,k,begin,end);
}
//数字在排序数组中出现的次数
int GetNumberOfK(vector<int> data ,int k) {
//二分查找,两次遍历,分别查找k在data中出现的第一个位置FirstIndex和最后一个位置LastIndex,则k出现的次数为LastIndex - FirstIndex + 1
int length = data.size();
//获取k在data中的第一个位置
int FirstIndex = GetFirstIndex(data,k,0,length-1);
//获取k在data中的最后一个位置
int LastIndex = GetLastIndex(data,k,0,length-1);
if(FirstIndex != -1 && LastIndex != -1){
return (LastIndex - FirstIndex + 1);
}
return 0;
}
};
python实现:
python中直接提供了count函数,用于查找数字k在数组data中出现的次数
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
return data.count(k)