题目描述
知识点
二分查找
结果
实现
码前思考
- 典型的用于背诵模板的题目;
- 主要需要需要注意,找最左边的,返回的是
left
,找最右边的,返回的是right
; - 此外,需要对
left
和right
数组越界的情况进行特判;
代码实现
//典型的用于训练手感的二分模板题
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res;
int left;
int right;
//首先找最左边的那一个
left = 0;
right = nums.size()-1;
while(left <= right){
int mid = left + (right-left)/2;
if(nums[mid] == target){
right = mid-1;
}else if(nums[mid] > target){
right = mid-1;
}else if(nums[mid] < target){
left = mid+1;
}
}
//表示没有找到
if(left==nums.size()||nums[left]!=target){
res.push_back(-1);
}else{
res.push_back(left);
}
//找最右边的那一个
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){
right = mid-1;
}else if(nums[mid] < target){
left = mid+1;
}
}
//表示没有找到
if(right==-1||nums[right]!=target){
res.push_back(-1);
}else{
res.push_back(right);
}
return res;
}
};
码后反思
无
二刷代码
主要是记得使用二分法的框架思想,其中[left,right]
代表当前的搜索的区间,而且是闭区间,然后就是对于>,=,<
的情况都应该分开进行讨论才好。
//二分法的训练模板题
//【left,right】表示查找的区间
//看见logN,就要想到二分法
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res;
int len = nums.size();
//首先找最左边的
int left=0;
int right=len-1;
while(left<=right){
int mid = (left+right)/2;
if(nums[mid]==target){
right = mid-1;
}else if(nums[mid]>target){
right = mid-1;
}else if(nums[mid]<target){
left = mid+1;
}
}
//printf("left:%d right:%d\n",left,right);
//然后进行检查,left应该是理所当然的位置
if(left>len-1){
res.push_back(-1);//代表没有找到
}else{
if(nums[left]==target){
res.push_back(left);
}else{
res.push_back(-1);//代表没有找到
}
}
left=0;
right=len-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]==target){
left=mid+1;
}else if(nums[mid]>target){
right=mid-1;
}else if(nums[mid]<target){
left=mid+1;
}
}
//printf("left:%d right:%d\n",left,right);
if(right<0){
res.push_back(-1);
}else{
if(nums[right]==target){
res.push_back(right);
}else{
res.push_back(-1);
}
}
return res;
}
};