034Search for a Range重复数字二分查找

    给一个数组,包含了重复的数字,找出目标的左右下标,就是二分查找多加了个重复元素的条件,找到左右下标。

    基本思路是,先二分查找,最后找到的话跳出,说明了找到了target,判断左右边界,接着用一个二分查找,注意这个二分查找的low、high改变条件与普通的不同,则可找到左右边界

class Solution {
    public int[] searchRange(int[] nums, int target) {
      int[] res = { -1, -1 };
		if (nums == null || nums.length == 0)
			return res;

		int low = 0;
		int high = nums.length - 1;
		int pos = 0;
		while (low <= high) {
			int mid = (low + high) / 2;
			pos = mid;
			if (nums[mid] > target)
				high = mid - 1;
			else if (nums[mid] < target)
				low = mid + 1;
			else {
				break;
			}
		}

		// 找不到直接返回
		if (nums[pos] != target) {
			return res;
		}

		// 跳出说明找到了相等的target,判断左右区间的大小
		int leftHigh = 0;
		int leftLow = 0;
		int rightHigh = 0;
		int rightLow = 0;

		// 左区间下标
		int leftMid = pos;
		leftLow = low;
		leftHigh = pos;
		while (leftLow <= leftHigh) {
			leftMid = (leftLow + leftHigh) / 2;
			if (nums[leftMid] == target) {
				leftHigh = leftMid - 1;
			} else {
				leftLow = leftMid + 1;
			}
		}
		res[0] = leftLow;

		// 右区间下标
		int rightMid = pos;
		rightHigh = high;
		rightLow = pos;
		while (rightLow <= rightHigh) {
			rightMid = (rightLow + rightHigh) / 2;
			if (nums[rightMid] == target) {
				rightLow = rightMid + 1;
			} else {
				rightHigh = rightMid - 1;
			}
		}
		res[1] = rightHigh;

		return res;
     }
    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值