Leetcode---在排序陣列中查詢元素的第一個和最後一個位置--遞迴
阿新 • • 發佈:2018-12-27
在排序陣列中查詢元素的第一個和最後一個位置
思路:
- 本題就是二分搜尋的變形,二分搜尋是找到一個數組中存在的目標數值的下標,這裡是尋找目標數值的起始和終點位置
- 處理方法只需要稍加改變,找到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;
}