问题描述
Given an array of integers 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].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
问题分析
该问题的要求很简单,给定一组按升序排序的整数,找出给定目标值的起始和结束位置。并且题目要求算法的复杂度为O(logn),如果未在数组中找到目标值,返回[-1, -1]。那么我们可以先用二分法找到所要找的target值,然后在这个值的位置向左和向右找和它相等的值即可。
代码展示
#include <iostream>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int n=nums.size();
int left = 0;
int right = n - 1;
vector<int> result;
result.push_back(-1);
result.push_back(-1);
while(left <= right)
{
int mid = (left + right) / 2; //用二分法找到符合要求的值
if(nums[mid] > target){
right = mid - 1;
}
else if(nums[mid] < target){
left = mid + 1;
}
else{ //找到了符合要求的值就从这个位置向左向右找其他和该值相等的值,几率它们的位置
result[0] = mid;
result[1] = mid;
int j = mid - 1;
while(j >= 0 && nums[j] == target){
result[0] = j;
j--;
}
j = mid + 1;
while(j < n && nums[j] == target){
result[1] = j;
j++;
}
break;
}
}
return result;
}
};
int main(){
int n;
vector<int> nums;
cout<<"请输入向量长度:";
cin>>n;
int num[n];
for(int i = 0;i<n;i++){
cin>>num[i];
nums.push_back(num[i]);
}
cout<<"请输入target: ";
int target;
cin>>target;
Solution solution;
vector<int> result=solution.searchRange(nums, target);
for(int i=0;i<result.size();i++){
cout<<result[i]<<" ";
}
cout<<endl;
}
运行结果展示