LeetCode数组专题(二)

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 }
View Code

=================================================================================================

猜你喜欢

转载自www.cnblogs.com/xpeanut/p/12891202.html
今日推荐