Come from : [https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/]
34. Find First and Last Position of Element in Sorted Array
1.Question
Given an array of integers nums sorted in ascending order, 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].
Example 1 :
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2 :
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
2.Answer
medium 类型题目。。
我的方法1:(二分查找法—两个函数实现左右边界)
AC代码如下:
//实现区间左端点
int left_bound(vector<int>& nums, int target)
{
int begin = 0;
int end = nums.size() - 1;
while(begin <= end)
{
int mid = (begin + end)/2;
if(nums[mid] == target)
{
if(mid == 0 || nums[mid-1] < target)
{
return mid;
}
end = mid - 1;
}
else if(nums[mid] < target)
{
begin = mid + 1;
}
else if(nums[mid] > target)
{
end = mid - 1;
}
}
return -1;
}
//实现区间右端点
int right_bound(vector<int>& nums, int target)
{
int begin = 0;
int end = nums.size() - 1;
while(begin <= end)
{
int mid = (begin + end)/2;
if(nums[mid] == target)
{
if(mid == nums.size() - 1 || nums[mid+1] > target)
{
return mid;
}
begin = mid + 1;
}
else if(nums[mid] < target)
{
begin = mid + 1;
}
else if(nums[mid] > target)
{
end = mid - 1;
}
}
return -1;
}
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res;
res.push_back(left_bound(nums, target));
res.push_back(right_bound(nums, target));
return res;
}
};
我的方法2:(二分查找法)
AC代码如下:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
vector<int> res = {-1,-1};
bool find = false;
while(right >= left && find == false && nums[left] <= target )
{
int mid = (left+right)/2;
if(nums[mid] > target)
right = mid-1;
else if(nums[mid] < target)
left = mid+1;
else
{
find = true;
while(mid > 0 && nums[mid-1] == target) //向前找起始点
mid--;
res[0] = mid;
while(mid < nums.size()-1 && nums[mid+1] == target) //向后找终止点
mid++;
res[1]=mid;
}
}
return res;
}
};
3.大神解答
速度排名第一(0秒 过分了啊)。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res {-1, -1};
if(nums.empty()) return res;
int begin = 0, end = nums.size() - 1;
while(begin < end){
int mid = (begin + end) / 2;
if(nums[mid] >= target) end = mid;
else begin = mid + 1;
}
if(nums[begin] != target) return res;
res[0] = begin;
end = nums.size();
while(begin < end){
int mid = (begin + end) / 2;
if(nums[mid] <= target) begin = mid+1;
else end = mid;
}
res[1] = begin - 1;
return res;
}
};
4.我的收获
二分查找。
fighting。。。
2019/6/25 胡云层 于南京 107