這題如果分別寫兩個(gè)二分查找,還比較簡單;如果想寫同一個(gè)函數(shù)做兩次二分,就有多一些邊界情況要考慮:
class Solution {
? ? public int[] searchRange(int[] nums, int target) {
? ? ? ? if (nums == null || nums.length == 0) return new int[]{-1, -1};
? ? ? ? int first = findFirstGreaterOrEqualsTo(nums, target, 0);
? ? ? ? if (first == nums.length || nums[first] != target) return new int[]{-1, -1};
? ? ? ? int last = findFirstGreaterOrEqualsTo(nums, target + 1, first + 1) - 1;
? ? ? ? return new int[]{first, last};
? ? }
? ? int findFirstGreaterOrEqualsTo(int[] nums, int target, int start) {
? ? ? ? int l = start, r = nums.length;
? ? ? ? // System.out.println("find first...");
? ? ? ? while (l < r) {
? ? ? ? ? ? // System.out.println("l: " + l + " r: " + r);
? ? ? ? ? ? int mid = l + (r - l) / 2, midVal = nums[mid];
? ? ? ? ? ? if (midVal >= target) {
? ? ? ? ? ? ? ? r = mid;
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? l = mid + 1;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return l;
? ? }
}