左側邊界
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 }
浙公網安備 33010602011771號