#include<iostream>
#include<algorithm>
using namespace std;
/*
所有二分都统一为while(left <= right)
对于查找左边界,需要考虑右边界越界的情况
对于查找右边界,需要考虑左边界越界的情况
如nums=[1,2,2,2,3] target = 5
对于查找左边界:
由于while(left <= right),最后一次left会指向nums.size() 越界
而左边不会越界,如target = 0, 因为当left==right时 left和right都指向1,此时nums[mid] < target,因此left会重新指向2,不会越界
在查找左边界时,应该注意nums[mid] == target时需要缩小右边界
如nums=[1,2,2,2,3] target = 0
对于查找右边界:
由于while(left <= right),最后一次right会指向-1 越界
而右边界不会越界,如target=5......同理
在查找右边界时,应该注意nums[mid] == target时需要缩小左边界(由于向下取整,如果left = mid 会陷入死循环)
*/
/*
常规二分,[1,2,2,2,3] target=2 返回1, 找不到返回-1
*/
int binary_search(vector<int>& nums, int target)
{
int left = 0, right = nums.size() - 1;
while(left <= right)
{
int mid = left + (right - left) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
left = mid + 1;
else if(nums[mid] > target)
right = mid - 1;
}
return -1;
}
/*
寻找左边界的索引如[1,2,2,2,3] target=2 返回1
*/
int binary_search(vector<int>& nums, int target)
{
int left = 0, right = nums.size() - 1; //注意!!!!
while(left <= right) //搜索边界为[left,right] 注意!!!!
{
int mid = left + (right - left) / 2;
if(nums[mid] == target) //收缩右边界 注意!!!!
right = mid - 1;
else if(nums[mid] < target) //target的值在右边
left = mid + 1;
else if(nums[mid] > target) //targe的值在左边
right = mid - 1;
}
if(left >= nums.size() || nums[left] != target) //越界检查和值是否存在检查 注意!!!!
return -1;
return left; //left为索引的位置 注意!!!!
}
/*
寻找右边界
*/
int binary_search(vector<int>& nums, int target)
{
//int left = 0, right = nums.size() - 1; //注意!!!!
//while(left <= right) //注意!!!!
//{
// int mid = left + (right - left) / 2;
// if(nums[mid] == target) //收缩左边界 注意!!!! 由于向下取整,如果left = mid 会陷入死循环
// left = mid+1;
// else if(nums[mid] < target) //target的值在右边
// left = mid + 1;
// else if(nums[mid] > target) //targe的值在左边
// right = mid - 1;
//}
//if(right < 0 || nums[left-1] != target) //注意!!!!
// return -1;
//方法二
int left = 0, right = nums.size() - 1; //注意!!!!
while(left <= right)
{
int mid = left + (right-left) / 2;
if(nums[mid] == target) //收缩左边界
left++;
else if(nums[mid] < target)
left++;
else
right--;
}
if(right < 0 || nums[right] != target)
return -1;
return right; //注意!!!!
}
int main()
{
vector<int> nums{1,2,2,2,3};
cout << binary_search(nums, 0) << endl;
return 0;
}
02-28
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交