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

思考:3次二分搜索。第一次看是否存在target,第二次寻找最左下标,第三次寻找最右下标。

class Solution {
private:
	vector<int> ret;
public:
    vector<int> searchRange(int A[], int n, int target) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
		ret.clear();
		int left=-1;
		int right=-1;
		int i=0;
		int j=n-1;
		int mid;
		bool flag=false;
		while(i<=j)
		{
			mid=(i+j)>>1;
			if(A[mid]>target) j=mid-1;
			else if(A[mid]<target) i=mid+1;
			else
			{
				flag=true;
				left=mid;
				right=mid;
				int a=i;
				int b=j;
				while(a<=left)
				{ 
					mid=(a+left)>>1;
					if(A[mid]<target) a=mid+1;
					else if((mid>0&&A[mid-1]!=target)||mid==0)//考虑边界情况
					{
						left=mid;
						break;
					}
					else left=mid-1;
				}
				while(right<=b)
				{ 
					mid=(right+b)>>1;
					if(A[mid]>target) b=mid-1;
					else if((mid<n-1&&A[mid+1]!=target)||mid==n-1) 
					{
						right=mid;
						break;
					}
					else right=mid+1;
				}
				if(flag)
				{
				    ret.push_back(left);
			     	ret.push_back(right);
				}
				return ret;
			}
		}
		ret.push_back(-1);
		ret.push_back(-1);
		return ret;
    }
};

      囧,第一次二分完全多余。。

原文地址:https://www.cnblogs.com/Rosanna/p/3432250.html