Search for a Range 区间搜索

33 篇文章 0 订阅
4 篇文章 0 订阅

Given a sorted array of integers, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,

return [3, 4].

给定一个有序数组(可能包含相同值)和一个目标值,找出目标值的起止下标,如果数组中不包含该目标值。则返回[-1,-1],

要求时间复杂度为O(log n)。

解题思路:可以借鉴二分查找方法,但是和二分查找还有一点不同。并不是找到目标值然后返回下标就行了。因为数组中有重复元素,目标值可能多次出现。所以分为两步

step1: 为了找到起点,先找到比目标值小但靠近目标值的元素,该元素往后一位的元素值等于目标值,则就是起点

step2:同理,若能找到起点,那么为了找到止点,先找比目标值大但最仅仅目标值的元素,该元素的前一个元素就是止点

public class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] range = {-1,-1};
        int lower = 0, upper = nums.length, mid;
	if (nums[upper - 1] < target) {
		return range;
	}
	//搜索起点
	while (lower < upper) {
		mid = (lower + upper) / 2;
		if (nums[mid] < target) {
			//尽可能往目标值上靠近
			lower = mid + 1;
		}else {
			//不适用mid-1,是因为要保留可能存在目标值的元素
			upper = mid;
		}
	}
	//如果目标值没找到,则返回[-1,-1]
	if (nums[lower] != target) {
		return range;
	}
	range[0] = lower;
	//搜索终点
	upper = nums.length;
	while (lower < upper) {
		mid = (lower + upper) / 2;
		if (nums[mid] > target) {
			//找出最靠近目标值又比目标值大的元素
			upper = mid;
		}else {
			lower = mid + 1;
		}
	}
	range[1] = upper-1;
	return range; 
    }
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值