一:题目
二:上码(暴力+二分)
// class Solution {
// public:
// /**
// 思路:1.首先这是一个升序的 那么相同的一定是会相连的// */// vector<int> searchRange(vector<int>& nums, int target) {// int flag = 0;
// int start = 0;// for(int i = 0; i < nums.size(); i++) {
// if (nums[i] == target){
// if(flag == 0) start = i;
// flag++;
// }
// }
// if(flag == 0) return {-1,-1};// return {start,start+flag-1};
// }
// };class Solution {
public:/**思路:1.这里分为3种情况1>当taget比nums的左边界还小的时候, terget比nums右边界还大的时候 返回{-1,-1}2>当target在nums中时候 那么我们就需要寻找target的左右边界寻找右边界 就是由当我们找到nums[mid] = target的时候 然后由left 不断逼近taget的右边界寻找左边界 就是当我们的nums[mid] = target的时候,然后 由right 不断逼近target的左边界3>当target在nums中且不存在的时候 返回{-1,-1}*/vector<int> searchRange(vector<int>& nums, int target) {int leftAns = leftBoder(nums,target);int rightAns = rightBoder(nums,target);//情况一if(rightAns == -2 || leftAns == -2) return {-1,-1};//情况二if(rightAns - leftAns > 1) return {leftAns+1,rightAns-1};//情况三return {-1,-1};}int rightBoder(vector<int>& nums,int target) {int left = 0;int right = nums.size()-1;int rightAns = -2;//num中没有target的话 做个标记while (left <= right) {int mid = (left + right)/2;if(nums[mid] > target) {right = mid -1;}else{//nums[mid] = target的时候 然后由left 不断逼近taget的右边界left = mid + 1;rightAns = left;}}return rightAns;}int leftBoder(vector<int>& nums,int target) {int left = 0;int right = nums.size()-1;int leftAns = -2;//num中没有target的话 做个标记while (left <= right) {int mid = (left + right)/2;if(nums[mid] < target) {left = mid + 1;}else{//nums[mid] = target的时候,然后 由right 不断逼近target的左边界right = mid - 1;leftAns = right;}}return leftAns;}};