左側邊界

 1 int left_bound(int[] nums, int target) {
 2     int left = 0, right = nums.length - 1;
 3     // 搜索區間為 [left, right]
 4     while (left <= right) {
 5         int mid = left + (right - left) / 2;
 6         if (nums[mid] < target) {
 7             // 搜索區間變為 [mid+1, right]
 8             left = mid + 1;
 9         } else if (nums[mid] > target) {
10             // 搜索區間變為 [left, mid-1]
11             right = mid - 1;
12         } else if (nums[mid] == target) {
13             // 收縮右側邊界
14             right = mid - 1;
15         }
16     }
17     // 檢查出界情況
18     if (left >= nums.length || nums[left] != target) {
19         return -1;
20     }
21     return left;
22 }

右側邊界

 1 int right_bound(int[] nums, int target) {
 2     int left = 0, right = nums.length - 1;
 3     while (left <= right) {
 4         int mid = left + (right - left) / 2;
 5         if (nums[mid] < target) {
 6             left = mid + 1;
 7         } else if (nums[mid] > target) {
 8             right = mid - 1;
 9         } else if (nums[mid] == target) {
10             // 這里改成收縮左側邊界即可
11             left = mid + 1;
12         }
13     }
14     // 這里改為檢查 right 越界的情況,見下圖
15     if (right < 0 || nums[right] != target) {
16         return -1;
17     }
18     return right;
19 }