1// 左闭右闭 [left, right]:查找第一个 == target
2function searchFirst(nums, target) {
3 let left = 0, right = nums.length - 1;
4 while (left <= right) {
5 const mid = left + ((right - left) >> 1);
6 if (nums[mid] < target) left = mid + 1;
7 else right = mid - 1;
8 }
9 return left < nums.length && nums[left] === target ? left : -1;
10}
11// 左闭右开 [left, right):查找最后一个 == target
12function searchLast(nums, target) {
13 let left = 0, right = nums.length;
14 while (left < right) {
15 const mid = left + ((right - left) >> 1);
16 if (nums[mid] <= target) left = mid + 1;
17 else right = mid;
18 }
19 return left > 0 && nums[left - 1] === target ? left - 1 : -1;
20}
21// 死循环陷阱:left = mid 导致区间不收缩
22function deadLoop(nums, target) {
23 let left = 0, right = nums.length - 1;
24 while (left <= right) {
25 const mid = (left + right) >> 1;
26 if (nums[mid] < target) left = mid; // BUG: 应为 mid + 1
27 else right = mid - 1;
28 }
29 return left;
30}