题目描述
统计一个数字在排序数组中出现的次数。
可以按统计字符的方法
与剑指offer 编程题(27):数组中出现次数统计解题思路和方法一样
http://blog.csdn.net/coolwriter/article/details/78867632
剑指offer 编程题(33):第一个只出现一次的字符
http://blog.csdn.net/coolwriter/article/details/78880874
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.size() <= 0)
{
return 0;
}
map<int, int> m;
for(int i =0;i < data.size();i++)
{
++m[data[i]];
}
return m[k];
}
};
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
//单纯的利用了count函数。。。。。
return count(data.begin(),data.end(),k);
}
};
equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i,j)内的每个元素都等同于value,而且[i,j)是[first,last)之中符合此一性质的最大子区间
如果以稍许不同的角度来思考equal_range,我们可把它想成是[first,last)内”与value等同”之所有元素形成的区间A,由于[fist,last)有序(sorted),所以我们知道”与value等同”之所有元素一定都相邻,于是,算法lower_bound返回区间A的第一个迭代器,算法upper_bound返回区间A的最后一个元素的下一个位置,算法equal_range则是以pair的形式将两者都返回
即使[fist,last)并未含有”与value等同”之任何元素,以上叙述仍然合理,这种情况下,”与value等同”之所有元素形成的,其实是一个空区间,在不破坏次序的情况下,只有一个位置可以插入value,而equal_range所返回的pair,其第一和第二(都是迭代器)皆指向该位置。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
//二分查找
auto resultPair = equal_range(data.begin(), data.end(),k);
return resultPair.second - resultPair.first;
}
};
lower_bound(应用于有序区间)
这是二分查找(binary search)的一种版本,试图在已排序的[first,last)中寻找元素value:
如果[first,last)具有与value相等的元素(s),便返回一个迭代器,指向其中第一个元素;
如果没有这样的元素存在,便返回“假设这样的元素存在时应该出现的位置”,也就是说,它返回一个迭代器,指向第一个“不小于value”的元素;
如果value大于{first,last)内的任何一个元素,则返回last。
另外一种理解,其返回值是“在不破坏排序状态的原则下,可插入value的第一个位置”。
upper_bound (应用于有序区间)
算法upper_bound是二分查找(binary search)法的一个版本。它视图在已排序的[first,last)中寻找value。更明确地说,它会返回“在不破坏顺序的情况下,可插入value的最后一个合适的位置”。
由于STL规范“区间圈定”时的起头和结尾并不对称(是的,[first,last)包含first但不包含last),所以upper_bound与lower_bound的返回值意义大有不同。如果你查找某值,而它的确出现在区间之内,
则lower_bound返回的是一个指向该元素的迭代器。然而upper_bound不这么做,因为upper_bound所返回的是在不破坏排序状态的情况下,value可被插入“最后一个”合适位置。如果value存在,那么它返回的迭代器将指向value的下一位置,而非指向value本身。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
auto left = lower_bound(data.begin(), data.end(), k);
auto right = upper_bound(data.begin(), data.end(), k);
return right - left;
}
};
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.size()==0)
return 0;
int i=0;
for(;i<data.size();i++)
{
if(data[i]==k)
break;
}
int length=data.size();
int j=length-1;
for(;j>=i;j--)
{
if(data[j]==k)
break;
}
return (j-i+1);
}
};