给定一个排序数组nums(nums中有重复元素)与目标值target,如果target在nums里出现,则返回target所在区间的左右端点下标,[左端点,右端点],如果target在nums里未出现,则返回[-1,-1]。
例如:
下标 =[0,1, 2,3,4, 5,6, 7]
nums=[5, 7,7, 8,8,8,8,10]
targe=8,则返回[3,6]
target=6, 则返回[-1,-1]
#include<vector>
class Solution
{
public:
Solution() {}
~Solution() {}
std::vector<int> searchRange(std::vector<int> &nums, int target)
{
std::vector<int> result;
result.push_back(left_bound(nums, target));
result.push_back(right_bound(nums, target));
return result;
}
private:
int left_bound(std::vector<int>& nums, int target)
{
int begin = 0;
int end = nums.size() - 1;
while (begin <= end)
{
int mid = (begin + end) / 2;
if (target == nums[mid])
{
if (mid == 0 || target > nums[mid - 1])
{
return mid;
}
end = mid - 1;
}
else if (target < nums[mid])
{
end = mid - 1;
}
else if (target > nums[mid])
{
begin = mid + 1;
}
}
return -1;
}
int right_bound(std::vector<int> &nums, int target)
{
int begin = 0;
int end = nums.size() - 1;
while (begin<=end)
{
int mid = (begin + end) / 2;
if (target==nums[mid])
{
if (mid==nums.size()-1||target<nums[mid+1])
{
return mid;
}
begin = mid + 1;
}
else if (target<nums[mid])
{
end = mid - 1;
}
else if (target>nums[mid])
{
begin = mid + 1;
}
}
return -1;
}
};
int main()
{
int test[] = { 5,7,7,8,8,8,8,10 };
std::vector<int> nums;
Solution solve;
for (int i = 0; i < sizeof(test)/sizeof(test[0]); i++)
{
nums.push_back(test[i]);
}
for (int i = 0; i < 12; i++)
{
std::vector<int> result = solve.searchRange(nums, i);
printf("%d: [%d, %d]\n", i, result[0], result[1]);
}
return 0;
}
运行结果为:
0: [-1, -1]
1: [-1, -1]
2: [-1, -1]
3: [-1, -1]
4: [-1, -1]
5: [0, 0]
6: [-1, -1]
7: [1, 2]
8: [3, 6]
9: [-1, -1]
10: [7, 7]
11: [-1, -1]