题目一(数字在排序数组中出现的次数):
统计一个数字在排序数组中出现的次数。
解题思路:考查二分查找的使用
解题代码:
1.没通过()
这种思路是利用二分查找找到一个k(我们要找的数字),然后分别向前向后查找第一个k和最后一个k的位置,然后相减。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
//排序数组中查找,用二分查找
if(data.size()<1)
return 0;
int l=0,r=data.size()-1;
int index=-1;
while(l<r)
{
int mid=l+(r-l)/2;
if(k==data[mid])
//index=l;
break;
else if(k<data[mid])
r=mid;
else
l=mid;
}
if(data[l]!=k)
return 0;
while(data[l]==k || data[r]==k)
{
if(data[l]==k)
l--;
if(data[r]==k)
r++;
}
return r-l;
}
};
2.更好的利用二分查找
直接利用二分查找,找到第一个k,和最后一个k,方法是每次二分查找时判断一下。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.empty())
return 0;
int number=0;
int first=GetFirstIndex(data,k,0,data.size()-1);
int last =GetLastIndex(data,k,0,data.size()-1);
if(first>-1 && last>-1)
number=last-first+1;
return number;
}
private:
//二分查找数组中第一个出现的k(递归实现)
int GetFirstIndex(vector<int>& data, int k, int start, int end)
{
if(start>end)
return -1;
int mid=start+(end-start)/2;
if(k==data[mid])
{
//判断前一个是否等于k
if((mid==0) || mid>0&&(k!=data[mid-1]))
return mid;
else
end=mid-1;
}
else if(k<data[mid])
end=mid-1;
else
start=mid+1;
return GetFirstIndex(data,k,start,end);
}
int GetLastIndex(vector<int>& data,int k, int start,int end)
{
if(start>end)
return -1;
int mid=start+(end-start)/2;
if(k==data[mid])
{
//判断后一个数字是否为k
if( (mid<end && data[mid+1]!=k) || mid==end )
return mid;
else
start=mid+1;
}
else if(k<data[mid])
end=mid-1;
else
start=mid+1;
return GetLastIndex(data,k,start,end);
}
};
题目二(0~n-1中缺失的数字):
解题思路:
解题代码:
题目三(数组中数值和下标想等的元素):
解题思路:
解题代码: