显然是二分,关键在于怎么处理mid,+1,-1的微妙处。
cpp实现:
/*
* @lc app=leetcode.cn id=34 lang=cpp
*
* [34] 在排序数组中查找元素的第一个和最后一个位置
*/
#include<iostream>
#include<vector>
using namespace std;
// @lc code=start
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if (nums.size()==0){
return vector<int> {-1,-1};
}
int low = lowerFound(nums,target);
int high = upperFound(nums,target);
if (low<0 || low>=nums.size()){
// 越界
low = -1;
}// 值不相等
else if (nums[low]!=target) low=-1;
if (high<0 || high>=nums.size()){
// 越界
high = -1;
}
// 值不相等
else if (nums[high]!=target) high=-1;
return vector<int> {low,high};
}
int lowerFound(vector<int>& nums, int target){
int left=0, right=nums.size()-1;
while(left<right){
int mid = left + (right-left)/2;
if (nums[mid]==target){
// 找到一个,收紧右边界
right = mid;
}
else if (nums[mid]<target){
// 在右边
left = mid+1;
}
else if (nums[mid]>target){
// 在左边
right = mid-1;
}
}
cout<<"left: "<<left<<endl;
return left;
}
int upperFound(vector<int> nums, int target){
int left=0, right=nums.size()-1;
while(left<right){
int mid = left + (right-left)/2;
if (nums[mid]==target){
// 找到一个,收紧左边界
left = mid+1;
}
else if (nums[mid]<target){
// 在右边
left = mid+1;
}
else if (nums[mid]>target){
// 在左边
right = mid-1;
}
}
if (nums[left]==target){
// 如果是[7,7,7],7这种情况
return left;
}
cout<<"high: "<<left-1<<endl;
return left-1; // 否则就是[7,7,8],7这种情况
}
};
// @lc code=end