34.在排序数组中查找元素的第一个和最后一个位置

题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
【34.在排序数组中查找元素的第一个和最后一个位置】分析:其实题目意思很简单,如果没有时间复杂度的限制的话,最快的方法莫过于从前往后遍历寻找第一个出现target的元素,若找到最后都没有找到目标元素则输出[-1,-1],然后从后往前寻找第一个出现target的元素,两个元素的下标即为所求结果。
但是题目中要求时间复杂度为logn,那么我们能想到的寻找元素的方法即为二分法,但是此题二分法需要分为两部分考虑,即寻找左边的target以及右边的target。

public int[] searchRange(int[] nums, int target) { int leftIdx = findLeftIdx(nums,target); int rightIdx = findRightIdx(nums,target); int[] result = {-1,-1}; if (leftIdx == nums.length || nums[leftIdx] != target) { return result; } result[0] = leftIdx; result[1] = rightIdx-1; return result; } public int findLeftIdx(int[] nums,int target){ int low = 0; int high = nums.length; while (low < high){ int mid = (low + high)/2; if(nums[mid] >= target){ high = mid; } else low = mid + 1; } return low; } public int findRightIdx(int[] nums,int target){ int low = 0; int high = nums.length; while (low < high){ int mid = (low+high)/2; if(nums[mid] > target){ high = mid; } else low = mid + 1; } return low; }

    推荐阅读