//力扣题号:704.二分查找
#include<iostream>
#include<vector>
using namespace std;
//左闭右闭的解决方案
int solution(vector<int>& nums, int target) {
int left = 0;//左指针设置为0
int right = nums.size() - 1;//右指针设置为最后一个元素的下标,因为右边是闭区间,所以可以指向最右边
while (left <= right) {//这里因为是左闭右闭的区间,因此左右指针可以指向同一个元素
int middle = (left + right) / 2;
//如果中间的元素小于目标元素,那么目标元素肯定在这个中间元素的右边,
// 并且肯定不等于该元素,并且我们设置的区间是左闭右闭的,
// 所以让左指针指向中间元素的下一个元素
if (nums[middle] < target) {
left = middle + 1;
}
//如果中间的元素大于目标元素,那么目标元素肯定在这个中间元素的左边边,
// 并且肯定不等于该元素,并且我们设置的区间是左闭右闭的,
// 所以让右指针指向中间元素的上一个元素
else if (nums[middle] > target) {
right = middle - 1;
}
else {
return middle;
}
}
return -1;
}
//左闭右开的解决方案
int solution1(vector<int>& nums, int target) {
int left = 0;//左指针设置为0
int right = nums.size();//右指针设置为最后一个元素的下一个元素的下标
while (left < right) {//这里因为是左闭右开的区间,因此左右指针不可以指向同一个元素
int middle = (left + right) / 2;
//如果中间的元素小于目标元素,那么目标元素肯定在这个中间元素的右边,
// 并且肯定不等于该元素,并且我们设置的区间是左闭右开的,
// 所以让左指针指向中间元素的下一个元素
if (nums[middle] < target) {
left = middle + 1;
}
//如果中间的元素大于目标元素,那么目标元素肯定在这个中间元素的左边,
// 并且肯定不等于该元素,并且我们设置的区间是左闭右开的,
// 所以让右指针指向中间元素,因为右边是开的,所以取不到右边这个中间元素
else if (nums[middle] > target) {
right = middle;
}
else {
return middle;
}
}
return -1;
}
int main() {
vector<int> array = { 1,2,3,4,5,6,7,8 };
cout<<solution(array, 6)<<endl;
cout << solution1(array, 6) << endl;
return 0;
}