34. 在排序陣列中查詢元素的第一個和最後一個位置
阿新 • • 發佈:2018-12-10
在排序陣列中查詢元素的第一個和最後一個位置
給定一個按照升序排列的整數陣列 nums,和一個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。
你的演算法時間複雜度必須是 O(log n) 級別。
如果陣列中不存在目標值,返回 [-1, -1]。
思路+程式碼+註釋:
class Solution { public int[] searchRange(int[] nums, int target) { /* 思路:使用二分查詢,查詢到值等於target的元素後,如果該元素大於前面的數那麼該元素就是起始位置,否則起始位置在該元素左邊 如果該元素小於後面的數那麼該元素就是終止位置 */ int startIndex=-1; int endIndex=-1; int low=0; int high=nums.length-1; while (low<=high) { int mid=(low+high)/2; if (nums[mid]==target) { //mid等於0是第一個元素肯定是起始位置 if (mid==0 || nums[mid]>nums[mid-1]) { //找到起始位置 startIndex=mid; break; }else { //mid前還有相等的元素,startIndex應該在左邊 high=mid-1; } }else if (nums[mid]<target) { low=mid+1; }else { high=mid-1; } } low=0; high=nums.length-1; while (low<=high) { int mid=(low+high)/2; if (nums[mid]==target) { //mid是最後一個元素肯定是終止位置 if (mid==nums.length-1 || nums[mid]<nums[mid+1]) { //找到終止位置 endIndex=mid; break; }else { //mid後還有相等的元素,endIndex應該在右邊 low=mid+1; } }else if (nums[mid]<target) { low=mid+1; }else { high=mid-1; } } return new int[]{startIndex,endIndex}; } }