二分法的递归与循环,核心就是通过不断缩减左右指针缩小查找数的范围
//递归代码
class Solution {
public:
int FindFir(vector<int> data, int head, int end, int k) {
//递归中的这个条件可作为循环的条件(相反)
if (head > end) return 0;//如果head跑到end后面或者end跑到head前面,注!!是比较的下标
int mid = (head + end) / 2;//这是取整,对于偶数数列都是取前一个的,奇数就取的中间的
if (data[mid] == k) {
return mid;
}
else if (data[mid] > k) {
end = mid - 1;//从mid的左边开始
return FindFir(data, head, end, k);
}
else {
head = mid + 1;//从mid的右边开始
return FindFir(data, head, end, k);
}
}
};
//循环代码
int FindFir_1(vector<int> data, int k, int start, int end) {
int middle = (start + end) /2;
//同理这里的循环条件可以作为递归条件(相反)
while (start <= end){
if (data[middle] == k) {
return middle;
}
else if (data[middle] < k){
start = middle + 1;
middle = (start + end) / 2;
}
else{
end = middle - 1;
middle = (start + end) / 2;
}
}
return 0;
}