[LeetCode34]Search for a Range

本文介绍如何在给定的排好序的数组中,通过两次二分查找来定位目标值的第一个和最后一个出现位置,从而确定其在数组中的区间范围。此方法适用于时间复杂度要求为O(log n)的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源:https://leetcode.com/problems/search-for-a-range/          点击打开链接


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].

   这题要求在一个排好序可能有重复元素的数里面找到包含某个的区。 要求使用O(log n)时间
所以我采用次二分找。 首先二分找到第一个该值的位置, 譬如m, 然后在[m, n)内第二次二
分找到最后一个该值的位置。 

class Solution34{
public:
	vector<int> searchRange(vector<int>& nums, int target){
		if (nums.size() == 0){
			return vector<int>({ -1, -1 });
		}
		
		vector<int> vec;
		int left = 0;
		int right = nums.size() - 1;
		//第一次二分查找第一个位置
		while (left <= right){
			int mid = (left + right) / 2;
			if (target <= nums[mid]){
				right = mid - 1;
			}
			else{
				left = mid + 1;
			}
		}
		if (left < nums.size() && nums[left] == target){
			vec.push_back(left);
		}
		else{
			return vector<int>({ -1, -1 });
		}

		left = left;
		right = nums.size() - 1;
		while (left <= right){
			int mid = (left + right) / 2;
			if (target >= nums[mid]){
				left = mid + 1;
			}
			else{
				right = mid - 1;
			}
		}
		vec.push_back(right);
		return vec;
	}
};

int main()
{
	Solution34 solution;
	{
		vector<int> nums = { 5, 7, 8, 8, 8, 10 };
		int target = 8;
		vector<int> vec;
		vec = solution.searchRange(nums, target);
		vector<int>::iterator iter;
		
		for (iter = vec.begin();iter != vec.end(); ++iter){			
			cout << *iter <<" ";
		}
	}

	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值