原本,二分法要求数组中的数据有序,并且不能有重复,但是本代码对无序的数据进行排序,但传入的数组中仍旧不能有重复
共有两种方法: 1、二分法中的左闭右闭即[left, right]
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
int find(vector<int>nums, int target) {
int left = 0;
int right = nums.size() - 1;
//middle的定义不能放在外面,每次循环middle的值都在变
while (left <= right) {
int middle = left + ((right - left) / 2);
if (nums[middle] > target) { //目标值小于中间值,所以目标值在【left, middle】左侧 因此改变区间右侧的right值
right = middle - 1;
}
else if(nums[middle]< target) {
left = middle + 1;
}
else if(nums[middle]= target) {
return middle;
}
}
return -1;
}
int main() {
vector<int>v = { 2,3,4 };
sort(v.begin(), v.end());
cout << find(v, 2)<<endl;
system("pause");
return 0;
}
2、 左闭右开区间
注意区别 while 的条件语句 以及左右区间的取值
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
int find(vector<int>nums, int target) {
int left = 0;
int right = nums.size() - 1;
//middle的定义不能放在外面,每次循环middle的值都在变
while (left < right) {
int middle = left + ((right - left) / 2);
if (nums[middle] > target) { //目标值小于中间值,所以目标值在【left, middle)左侧 因此改变区间右侧的right值
right = middle ;//这里的right不再是middle-1,因为如果middle-1 区间是左闭右开的,将会错过middle-1这个位置的值
}
else if(nums[middle]< target) {
left = middle + 1;
}
else if(nums[middle]= target) {
return middle;
}
}
return -1;
}
int main() {
vector<int>v = { 5,3,2,7 };
sort(v.begin(), v.end());
cout << find(v, 3)<<endl;
system("pause");
return 0;