LeetCode34——Search for a Range

LeetCode34——Search for a Range

题意:

在有序序列中找到重复出现的数字出现的范围,返回一个二元组代表范围的闭区间,如果找不到target则返回[-1,-1]


连续考察二分查找的应用,这里的思路就是使用两次二分查找,分别找出上界和下界,如果nums[low]==target,则下界索引就是low,否则为-1,上界求解方法类似。

感觉这道题目的难点就是对标准二分查找的修改,并获取查找成功时 索引low和索引high的状态。

然后注意注释中求解上界时候的注释,很关键。


代码:

class Solution {
public:
	vector<int> searchRange(vector<int>& nums, int target) {
		int len = nums.size();
		int low = 0;
		int high = len - 1;
		int mid;
		int resNum1;
		int resNum2;
		vector<int> result;
		while (low < high)// 二分查找上界
		{
			int mid = low + (high - low) / 2;
			if (nums[mid] < target)
			{
				low = mid + 1;
			}
			else
				high = mid;
		}
		resNum1 = nums[low] == target ? low : -1;

		low = 0;
		high = len - 1;
		while (low < high)//二分查找下界
		{
			int mid = low + (high - low+1) / 2;//!!!!!若nums[mid]<=target时,若此时low+1==high,进入死循环
			if (nums[mid] > target)
			{
				high = mid - 1;
			}
			else
				low = mid;
		}
		resNum2 = nums[high] == target ? high : -1;

		result.push_back(resNum1);
		result.push_back(resNum2);
		return result;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值