用二分法的时候,数组要是有序的。
二分法主要的就是注意边界。
有两种边界:
1.左闭右闭;
- while (left <= right)
- if (nums[mid] > target) right 要赋值为 mid - 1,因为当前这个nums[mid]一定不是target,那么接下来要查找的左区间结束下标位置就是 mid - 1
int left = 0; int right = nums.size()-1; while (left <= right) { // 定义target在左闭右开的区间里,即:[left, right] int middle = left + ((right - left) >> 1); if (nums[middle] > target) { right = middle - 1; // target 在左区间 } else if (nums[middle] < target) { left = middle + 1; // target 在右区间 } else { // nums[middle] == target return middle; // 数组中找到目标值,直接返回下标 } }
2.左闭右开。
- while (left < right)
- if (nums[mid] > target) right 更新为 mid,因为当前nums[mid]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为mid,即:下一个查询区间不会去比较
int left = 0; int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right) while (left < right) { int middle = left + ((right - left) >> 1); if (nums[middle] > target) { right = middle; // target 在左区间 } else if (nums[middle] < target) { left = middle + 1; // target 在右区间 } else { // nums[middle] == target return middle; // 数组中找到目标值,直接返回下标 } }