//24.03.10
//寒假学的二分,都开学了才想着总结,笔者一开始学的时候不是很明白,做了一些题目后才略懂一点点,见笑了;
//首先是基础二分,类似公式,笔者是直接背下来了
//力扣二分查找原题
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]
while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=
int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
if (nums[middle] > target) {
right = middle - 1; // target 在左区间,所以[left, middle - 1]
} else if (nums[middle] < target) {
left = middle + 1; // target 在右区间,所以[middle + 1, right]
} else { // nums[middle] == target
return middle; // 数组中找到目标值,直接返回下标
}
}
// 未找到目标值
return -1;
}
};
//本来笔者自己写了一个,但是没有Carl大佬写得好,就直接搬运了 hwh;(感谢Carl大佬)
//笔者之后又做了学长推荐的计蒜客的二分查找的题目,又学了lower_bound和upper_bound;
//一开始学长讲的没太听明白,就用万能的CSDN查了一下
//关于lower_bound( )和upper_bound( )的常见用法
//一开始 greater<type>() 没太听明白,笔者将其与sort排序中的 greater<type>() 一起记(其中的 type 是数据类型),这样就简单很多;
//这些大概就是二分查找初步吧……
~~~//仅当笔者个人备忘录使用。