34. Find First and Last Position of Element in Sorted Array 难度:Medium
1 /** 2 * 这个不同于简单的暴力搜索,有题意可知这是----有序数组, 3 * 先利用二分找出第一个与target相等的值,再利用二分找出第二个 4 * 时间复杂度:O(logn) 5 */ 6 class Solution { 7 private int extremeInsertionIndex(int[] nums, int target, boolean left) { 8 int lo = 0; 9 int hi = nums.length; 10 11 while (lo < hi) { 12 int mid = (lo + hi)/2; 13 // 在找第一个位置时,将left=true,若是元素出现在左半边,那么接着在左半边搜索更小位置, 14 // 看看能不能再次出现与target相等的元素;若是元素出现在右半边,二分走起, 15 // mid随着lo的增大而增大,接着搜索,循环往复; 16 // 在找第二个位置时,将left=false,这样可以保障在搜索到同样元素时,可以接着往右搜索 17 if (nums[mid] > target || (left && target == nums[mid])) { 18 hi = mid; 19 } else { 20 lo = mid + 1; 21 } 22 } 23 return lo; 24 } 25 26 public int[] searchRange(int[] nums, int target) { 27 int[] targetRange = {-1, -1}; 28 int leftIndex = extremeInsertionIndex(nums, target, true); 29 30 if (leftIndex == nums.length || nums[leftIndex] != target) { 31 return targetRange; 32 } 33 34 targetRange[0] = leftIndex; 35 // 在搜到最后一个不是target的值时,他一定位于目标值的右边一位,所以要减1 36 targetRange[1] = extremeInsertionIndex(nums, target, false) - 1; 37 return targetRange; 38 } 39 }
=================================================================================================