二分查找寻找一个数(非递归)
-
首先二分查找的基础是在一个有序数组上进行的。
-
非递归代码如下:
int search(vector<int>& nums, int target) {
int low = 0,high = nums.size()-1,mid;
while(low<=high) //当查询数组为空时,结束循环
{
mid = (start+end)/2;
if(nums[mid]==target) return mid; //返回查询元素下标。
else if(nums[mid]>=target) high = mid-1; //说明查询元素在左半区
else low = mid+1; //说明查询元素在右半区
}
return -1; //没有查到元素,返回-1.
}
二分查找一个元素(递归)
-
二分查找就是通过比较把一个大的数组不断缩小分成小数组来查找,所以可以采用递归来实现。
int search(vector<int>& nums, int target,int start,int end) {
int mid = (start + end)/2;
if(low<=high)
{
if(nums[mid]==target) return mid;
else if(nums[mid]>target) return search(vector<int>& nums,target,start,mid-1);
else return search(nums,target,mid+1,end);
}
else return -1;
}
二分查找左边界
-
在一个有重复元素的排序数组中,查找某个元素的左边界
-
如[1,2,3,3,3,4],target=3,应返回2;
int searchRange(vector<int>& nums, int target) {
int right = nums.size(),left = 0;
while(left<right) //找左边界
{
int mid =left + (right - left)/2;
if(nums[mid] == target) right = mid;
else if(nums[mid] > target) right = mid;
else left = mid+1;
}
if(nums[right-1]==target) return left;
return -1;
}
二分查找右边界
-
在一个有重复元素的排序数组中,查找某个元素的右边界
-
如[1,2,3,3,3,4],target=3,应返回4;
int searchRange(vector<int>& nums, int target) {
int right = nums.size()-1,left = 0;
while(left<right) //找右边界
{
int mid =left + (right - left)/2;
if(nums[mid] == target) left = mid+1;
else if(nums[mid] > target) right = mid-1;
else left = mid+1;
}
if(nums[right-1]==target) return right-1;
return -1;
}

408

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



