题目描述
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
0 <= 数组长度 <= 50000
解法一:基于flag标记的暴力法 (执行用时20ms,内存消耗13.2MB)
class Solution {
public:
int search(vector<int>& nums, int target) {
int flag = 0;
for (int i = 0; i<int(nums.size()); i++)
{
if (nums[i] == target)
flag++;
}
return flag;
}
};
解法二:基于unordered_map的方法 (执行用时44ms,内存消耗13.4MB)
class Solution2 {
public:
int search(vector<int>& nums, int target) {
unordered_map<int, int> a;
for (int i = 0; i<int(nums.size()); i++)
a[nums[i]]++;
unordered_map<int, int>::iterator it;
it = a.find(target);
if (it != a.end())
{
return it->second;
}
return 0;
}
};
解法三:基于ower_bound和upper_bound的方法 (执行用时44ms,内存消耗13.4MB)
/****************************************
基于ower_bound和upper_bound的方法 (执行用时44ms,内存消耗13.4MB)
upper_bound():返回的是被查序列中第一个大于查找值得指针;
lower_bound():返回的是被查序列中第一个大于等于查找值的指针;
*****************************************/
class Solution3 {
public:
int search(vector<int>& nums, int target) {
int low = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
int upp = upper_bound(nums.begin(), nums.end(), target) - nums.begin();
return upp - low;
}
};
main()函数
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
int main()
{
vector<int> nums;
cout << "请输入有序数组的大小: " << endl;
int Size;
cin >> Size;
int Currval;
cout << "请输入有序数组的元素: " << endl;
for (int i = 0; i < Size; i++)
{
cin >> Currval;
nums.push_back(Currval);
}
int target;
cout << "请输入查找元素: " << endl;
cin >> target;
Solution answer;
cout << "查找元素在数组中出现的次数为:" << answer.search(nums, target) << endl;
system("pause");
return 0;
}