查找算法中,惯用的二分查找是得学会的。
二分查找
二分查找的难点在于区间的选取,我们默认全局使用左闭右开。
三个细节(前俩都是因为左闭右开):
- 1 while(left < right)
- 2 right = middle, left = middle + 1
- 3 int middle = left + (right – left) / 2; 这么计算可以防止溢出
int two_find(vector &nums, int target) {
int left = 0, right = nums.size();
while (left < right) { int middle = (left + right) / 2; if (nums[middle] == target) return middle; else if (nums[middle] > target)
right = middle;
else if (nums[middle] < target)
left = middle + 1;
}
return -1;
}
int main() {
vector nums = {12, 43, 21, 47, 87, 9, 13, 40};
int output = two_find(nums, 21);
cout << output << endl;
return 0;
}