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;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值