1 遍历寻找
2 二分查找法:
正常二分法
递归二分法
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
// 数字在排序数组中出现的次数
//遍历
int GetNumberOfK(vector<int> array, int k) {
if (array.size() == 0) {
return 0;
}
int count = 0;
for (int i = 0; i < array.size(); i++) {
if (array[i] == k) {
count++;
}
}
return count;
}
//二分法查找
int GetNumberOfK2(vector<int> array, int k) {
if (array.size() == 0) {
return 0;
}
int index = BinarySearch( array, k);
//int index = BinarySearch2(array, 0, array.size()-1, k);
if (index == -1) {
return 0;
}
//统计次数
int count = 1;
for ( int j = index - 1; j >= 0; j-- ) {
if (array[j] == array[index]) {
count++;
}
}
for ( int j = index + 1; j < array.size(); j++ ) {
if (array[j] == array[index]){
count++;
}
}
return count;
}
//二分法
int BinarySearch(vector<int> arr , int k) {
int low = 0, high = arr.size()-1;
int mid = 0;
while (low < high) {
int mid = low +(high - low)/2;
if (arr[mid] == k) {
return mid;
}
if (arr[mid] > k) {
high = mid - 1;
}
if (arr[mid] < k) {
low = mid + 1;
}
}
return -1;
}
//二分法递归
int BinarySearch2(vector<int> arr, int begin ,int end, int k) {
if (begin > end) {
return -1;
}
int mid = begin + (end - begin)/2;
if (arr[mid] == k) {
return mid;
}
else if (arr[mid] > k) {
return BinarySearch2(arr, begin, mid-1, k); // 递归回去
}
else if (arr[mid < k]) {
return BinarySearch2(arr, mid+1, end, k); // 递归回去
}
}
};
int main()
{
int a1[] = { 5, 7 , 6, 3, 4, 9, 8};
int a2[] = { 1, 2 , 4, 8, 8, 8, 9};
vector<int> vec(a2, a2 + 7);
Solution s;
cout << s.GetNumberOfK2(vec, 8) << endl;
/*for (int i = 0; i < array.size(); i++) {
cout << array[i] << endl;
}*/
}