//解法一:非递归版,最常见的一种二分查找算法
class Solution
{
public:
int search(vector<int>& nums, int target)
{
int ret=-1;
int begin=0;
int end=nums.size()-1;
while(begin<=end)
{
//int mid=(begin+end)/2; 为了防止整形溢出,所以采用下面的写法
int mid=begin+(end-begin)/2;
if(nums[mid]==target)
{
ret=mid;
break;
}
else if(nums[mid]>target)
{
end=mid-1;
}
else
{
begin=mid+1;
}
}
return ret;
}
};
//解法二:递归版
class Solution {
public:
int search(vector<int>& nums, int target)
{
return search(nums,0,nums.size()-1,target);
}
int search(vector<int>& nums,int begin,int end,int target)
{
int ret=-1;
if(begin<=end)
{
int mid=begin+(end-begin)/2;
if(nums[mid]==target)
{
ret=mid;
}
else if(nums[mid]>target)
{
ret=search(nums,begin,mid-1,target);
}
else
{
ret=search(nums,mid+1,end,target);
}
}
return ret;
}
};
变形一:查找第一个值等于给定值的元素
template <typename T>
int binSearch(T array[],int len,T target)
{
int ret=-1;
int begin=0;
int end=len-1;
while(begin<=end)
{
int mid=begin+((end-begin)>>1);//提高效率,因为计算机处理移位操作,要比除法操作高效很多
if(array[mid]>target)
{
end=mid-1;
}
else if(array[mid]<target)
{
begin=mid+1;
}
else
{
if(mid==0||array[mid-1]<target)
{
ret=mid;
break;
}
else
{
end=mid-1;
}
}
}
return ret;
}
变体二:查找最后一个值等于给定值的元素
template <typename T>
int binSearch(T array[],int len,T target)
{
int ret=-1;
int begin=0;
int end=len-1;
while(begin<=end)
{
int mid=begin+((end-begin)>>1);//提高效率,因为计算机处理移位操作,要比除法操作高效很多
if(array[mid]>target)
{
end=mid-1;
}
else if(array[mid]<target)
{
begin=mid+1;
}
else
{
if(mid==len-1||array[mid+1]>target)
{
ret=mid;
break;
}
else
{
end=mid-1;
}
}
}
return ret;
}
变体三:查找第一个大于等于给定值的元素
template <typename T>
int binSearch(T array[],int len,T target)
{
int ret=-1;
int begin=0;
int end=len-1;
while(begin<=end)
{
int mid=begin+((end-begin)>>1);//提高效率,因为计算机处理移位操作,要比除法操作高效很多
if(array[mid]>=target)
{
if(mid==0||array[mid-1]<target)
{
ret=mid;
break;
}
else
{
end=mid-1;
}
}
else
{
begin=mid+1;
}
}
return ret;
}
变体四:查找最后一个小于等于给定值的元素
template <typename T>
int binSearch(T array[],int len,T target)
{
int ret=-1;
int begin=0;
int end=len-1;
while(begin<=end)
{
int mid=begin+((end-begin)>>1);//提高效率,因为计算机处理移位操作,要比除法操作高效很多
if(array[mid]>target)
{
end=mid-1;
}
else
{
if(mid==len-1||array[mid+1]>target)
{
ret=mid;
break;
}
else
{
begin=mid+1;
}
}
}
return ret;
}
539

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



