1. 程式人生 > >Leetcode---在排序陣列中查詢元素的第一個和最後一個位置--遞迴

Leetcode---在排序陣列中查詢元素的第一個和最後一個位置--遞迴

在排序陣列中查詢元素的第一個和最後一個位置

題目連結:在排序陣列中查詢元素的第一個和最後一個位置

思路:
  • 本題就是二分搜尋的變形,二分搜尋是找到一個數組中存在的目標數值的下標,這裡是尋找目標數值的起始和終點位置
  • 處理方法只需要稍加改變,找到mid下標
  • 該位置值小於目標則捨棄左段
  • 若大於則捨棄右段
  • 等於時:左右兩斷都要尋找,分別找到左段中起始,和右段中的終點位置,合在一起作為整個陣列的返回值,這裡又分為三種情況,起始和終點跨越mid,起始位置在mid,終點位置在mid,對其分別處理即可
	public static int[] searchRange
(int[] nums, int target) { int[] result = new int[2]; result[0] = -1; result[1] = -1; if(nums==null||nums.length==0) { return result; }else if(nums.length==1) { if(nums[0]!=target) return result; else { result[0] = 0; result[1] = 0; return result; } } return findRange
(nums,0,nums.length-1,target); } public static int[] findRange(int[] nums,int first,int last,int target) { int[] result = new int[2]; if(first>last) { result[0] = -1; result[1] = -1; return result; } int mid = first + ((last-first)>>1); if(target == nums[mid]) { int left[
] = findRange(nums,first,mid-1,target); int right[] = findRange(nums, mid+1, last, target); result[0]=left[0]==-1?mid:left[0]; result[1]=right[1]==-1?mid:right[1]; }else if(target > nums[mid]) { return findRange(nums,mid+1,last,target); }else { return findRange(nums,first,mid-1,target); } return result; }