欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

34. 搜索范围

程序员文章站 2022-07-15 20:57:03
...

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

你的算法时间复杂度必须是 O(log n) 级别。

如果数组中不存在目标值,返回 [-1, -1]

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
思路:两次二分查找,分别找出左右边界。
左边界点满足nums[flagl-1]<target, nums[flagl]=target; 右边界点满足nums[flagr+1]>target, nums[flagr]=target。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
	int flagl = -1, flagr = -1, l=0, r=nums.size()-1;
	if (nums.empty()) return vector<int>{-1, -1};

	//开始找左边界点:左边界点满足nums[flagl-1]<target, nums[flagl]=target;
	while (l<=r){
		int mid = l + (r - l) / 2;
		if ((mid == 0 || mid> 0 && nums[mid - 1] < target) && nums[mid] == target ){
			flagl = mid;
			break;
		}
		if (nums[mid] >= target) r = mid - 1;
		if (nums[mid] < target) l = mid + 1;
	}

	//开始找右边界点:右边界点满足nums[flagr+1]>target, nums[flagr]=target.
	l = 0, r = nums.size() - 1;
	while (l<=r){
		int mid = l + (r - l) / 2;
		if ((mid == nums.size()-1 || mid< nums.size()-1 && nums[mid + 1] > target) && nums[mid] == target){
			flagr = mid;
			break;
		}
		if (nums[mid] > target) r = mid - 1;
		if (nums[mid] <= target) l = mid + 1;
	}
	return vector<int>{flagl, flagr};
}
};