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;
	}

你可能感兴趣的:(算法,Leetcode)