题目一:数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。
解题思路:
方法一:
直接遍历一遍,O(n)的时间复杂度。
方法二:二分查找,时间复杂度度更优
分别二分查找第一个k的位置和最后一个k的位置
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.size()==0) return 0;
int FirstKIndex=-1;//第一K的下标
int LastKIndex=-1;//组后一个K的下标
int low=0,high=data.size()-1;
//二分查找找第一个K的下标
while(low<=high){
int mid=(low+high)/2;
if(data[mid]==k){
if((mid>0&&data[mid-1]!=k)||mid==0) {
FirstKIndex=mid;
break;
}else {
high=mid-1;
}
}else if(data[mid]>k){
high=mid-1;
}else{
low=mid+1;
}
}
//二分查找找最后一个K的下标
low=0;
high=data.size()-1;
while(low<=high){
int mid=(low+high)/2;
if(data[mid]==k){
if((mid<data.size()-1&&data[mid+1]!=k)||mid==data.size()-1) {
LastKIndex=mid;
break;
}else{
low=mid+1;
}
}else if(data[mid]>k){
high=mid-1;
}else{
low=mid+1;
}
}
int res=0;
//如果数组中有K
if(FirstKIndex>=0) res=LastKIndex-FirstKIndex+1;
return res;
}
题目二:0~n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
解题思路:
二分查找第一个值和下标不相等的元素。有一点要注意的是如果查找到最后一个元素还是未找到缺失的元素(也就是还未找到值和下标不相等的元素)说明缺失的是最后一个元素。
如果中间元素的值和下标相等:
- 下一轮查找只需要从中间元素的右边查找。
如果中间元素的值与下标不相等:
- 如果中间元素的前一个元素值与下标相等,这时的中间元素就是第一个值和下标不相等的元素。
- 如果中间元素的前一个元素值与下标不相等,这时第一个值和下标不相等的元素一定在中甲元素的左边,下一轮查找只需要从中间元素的左边查找。
//查找第一个值和下标不相等的元素
int GetMissingNumber(const int* numbers, int length)
{
if(numbers==nullptr||length<=0) return -1;
int FirstNotSame=-1;
int low=0;
int high=length-1;
while(low<=high)
{
int mid=(low+high)>>1;
if(numbers[mid]!=mid)
{
if((mid>0&&numbers[mid-1]==mid-1)||mid==0)
{
FirstNotSame=mid;
break;
}
high=mid-1;
}
else low=mid+1;
}
int res=-1;
//查到最后一个数字还没找到下标与值不相等的元素,说明缺失的数是最后一个数
if(low==length-1) FirstNotSame=length;
if(FirstNotSame>=0) res=FirstNotSame;
return res;
}
题目三:数组中数值和下标相等的元素
设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数找出数组中任意一个数值等于其下标的元素。例如,在数组{-3, -1,1, 3, 5}中,数字3和它的下标相等。
解题思路:
二分查找值与下标相等的元素。
由于数组里的数字递增且唯一,
如果中间元素的值与下标相等:
- 找到
如果中间元素 值 小于 下标:
- 那么中间元素左边的所有元素的值都小于下标,下一轮查找只需要从中间元素的右边查找
如果中间元素 值 大于 下标:
- 那么中间元素右边的所有元素的值都大于下标,下一轮查找只需要中中间元素的左边查找
int GetNumberSameAsIndex(const int* numbers, int length)
{
if(numbers==nullptr||length<=0) return -1;
int same=-1;
int low=0;
int high=length-1;
while(low<=high)
{
int mid=(low+high)>>1;
if(numbers[mid]==mid)
{
same=mid;
break;
}
if(numbers[mid]<mid) low=mid+1;
if(numbers[mid]>mid) high=mid-1;
}
int res=-1;
if(same>=0) res=numbers[same];
return res;
}
本文探讨了在排序数组中查找特定元素的高效算法,包括数字出现次数、缺失数字及数值等于下标的元素。通过二分查找优化了查找速度,详细解析了每种情况的解题思路。
1212

被折叠的 条评论
为什么被折叠?



