Leetcode笔记目录
一、题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。
示例1:
- 输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例2:
- 输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
二、解题过程
1.思想
典型的二分查找算法,可以直接套用模板,难点在于判断边界:
- 本题直接套用左闭右开模板;
- 注意本题的边界判断,即可以发生数组越界;
2.代码
左闭右开模板:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.size()==0)return vector<int>{-1,-1}; //错误1
int n1=lower_bound(nums,target),n2=upper_bound(nums,target);
if(n1==nums.size()||nums[n1]!=target) return vector<int>{-1,-1}; //错误2
return vector<int>{n1,n2-1};
}
int lower_bound(vector<int>& nums, int target){
int left=0,right=nums.size(),mid;
while(left<right){
mid = left+(right-left)/2;
if(nums[mid]>=target) right=mid;
else left=mid+1;
}
return left;
}
int upper_bound(vector<int>& nums, int target){
int left=0,right=nums.size(),mid;
while(left<right){
mid = left+(right-left)/2;
if(nums[mid]>target) right=mid;
else left=mid+1;
}
return left;
}
- 错误
- 首先判断是否为空集;
- 注意if中判断语句的顺序,首先判断是否越界然后判断是否为target,且一旦lower_bound不存在,upper_bound也不存在,因此只判断一个就好。
三、总结
可以套模板,难点在于边界判断。