您的位置:首页 > 理论基础 > 数据结构算法

leetcode——Search for a Range

2016-06-15 22:49 363 查看
题目:

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

/*本质上还是二分查找法,只是修改查找的条件,不仅仅是找到target,而且保证是最前面和最后面的target*/
class Solution {
public:
//isFirst == true在nums中查找第一次出现的target,否则查找最后一次出现的target
int binarySearch(vector<int>& nums, int target, bool isFirst)
{
if (nums.empty())
{
return -1;
}
int first = 0, last = nums.size();//保证前闭后开的区间
//在迭代的过程中first始终指向未被舍弃的元素,last始终指向被舍弃的元素

while (first < last)//first == last说明没找到,因为last指向的被舍弃的元素
{
if (isFirst)
{
if (nums[first] == target && (first == 0 || nums[first - 1] != target))
{
return first;
}
int mid = first + (last - first) / 2;
if (nums[mid] >= target)
{
if (nums[mid] == target && (mid == 0 || nums[mid - 1] != target))
{
return mid;
}
last = mid;//last肯定指向非目标元素,所以先要确定mid不是想要的
}
else
{
first = mid + 1;
}
}
else
{
if (nums[first] == target && (first == nums.size() - 1 || nums[first + 1] != target))
{
return first;
}
int mid = first + (last - first) / 2;
if (nums[mid] <= target)
{
if (nums[mid] == target && (mid == nums.size() - 1 || nums[mid + 1] != target))
{
return mid;
}
first = mid + 1;
}
else
{
last = mid;
}
}
}

return -1;

}
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res(2);
res[0] = binarySearch(nums, target, true);
res[1] = binarySearch(nums, target, false);
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息