[https://leetcode.cn/problems/binary-search/](题目链接)
二分查找有前提条件:序列有序。序列中无重复元素不是必要条件。
二分查找注意区间:如果是左闭右开,while循环的条件是left < right,每一次查找结束后,left要更新为mid+1或者right更新为mid;
如果是左闭右闭,循环条件是left <= right,left更新为mid+1或者right更新为mid-1。
*相关题目
[https://leetcode.cn/problems/search-insert-position/](搜索插入位置)
题目条件是有序数组,一共四种情况,这里以区间左闭右开为例子,第一种情况插入在所有元素之前,这时left = right = 0;第二种情况找到元素,return mid即可;第三种情况在区间中段插入,如果最后mid < target,那么left = mid + 1,循环终止,插入位置在left,如果mid > target,那么left = mid - 1,插入位置在left;第四种情况在所有元素之后插入,这是left = right = size;所以最终返回left。
[https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/](在排序数组中查找元素的第一个和最后一个位置)
可以用两个二分法分别寻找左边界和右边界,第一个while循环找左边界,每次mid == target则更新leftburder的值并把right的值更新,第二个循环同理。
[https://leetcode.cn/problems/sqrtx/](x的平方根)
首先明确平方根的范围,除了0和1之外,x的平方根小于等于x/2;然后从1到x/2寻找mid*mid == x的数,代码中要用mid == x / mid,防止溢出。因为两种情况都是right比较小,所以返回right。
[https://leetcode.cn/problems/valid-perfect-square/](有效的完全平方数)
同上题。