数组-搜索区间-中等

描述
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
您在真实的面试中是否遇到过这个题?  是
样例
给出[5, 7, 7, 8, 8, 10]和目标值target=8,
返回[3, 4]
挑战

时间复杂度 O(log n)

题目链接

分析

个人觉得这道题比较扣边界,需要找到小于target的数,剩下的就是大于等于target的数。对剩下的部分进行比较,返回最后的结果。

这里,二分的时候需要注意,容易出现死循环。


程序

class Solution {
public:
	/**
	* @param A: an integer sorted array
	* @param target: an integer to be inserted
	* @return: a list of length 2, [index1, index2]
	*/
	int LowBound(vector<int> &A, int target){//找到可能第一个相等的位置
		int left = 0;
		int right = A.size();
		while (left < right)
		{
			int mid = left + (right - left)/2;
			cout << "mid = " << mid << endl;
			if (A[mid] < target)
				left = mid + 1;
			else
				right = mid;
		}
		cout << "left = " << left << endl;
		return left;
	}
	vector<int> searchRange(vector<int> &A, int target) {
		// write your code here
		vector<int> result(2, -1);
		if (A.empty())
			return result;
		int begin = LowBound(A, target);
		int end = begin;
		bool signal = false;
		while (end <= A.size() -1 && A[end] ==  target)
		{
			++end;
			signal = true;
		}
		if (signal){
			result[0] = begin;
			result[1] = end - 1;
		}
		return result;
	}
};


猜你喜欢

转载自blog.csdn.net/qq_18124075/article/details/80520757
今日推荐