Leetcode34
1.问题描述
2.解决方案
解法一:二分查找迭代
1.先二分查找找到target对应index,但是具体找到的是哪一个不确定
2.然后我们只需要用i,j分别向前和向后遍历找边界就好了
3.代码实现有细节,二分查找就不说了,就是向前向后遍历的细节
错误的遍历条件(错误样例如图):i>=0&&j<=nums.size()-1
正确的遍历条件:i>=0||j<=nums.size()-1
其实看了错误样例就明白了,如果其中一个i或者j已经越界,但是另一个还没越界也得允许进入循环,当然防止段错误,判断条件前面要加上限制,这个错误说句实话就是没考虑边界情况比如说数组长度是1,2这种小数组,下次注意!要是不给错误样例还真未必能找到呢!
//for(int i=index-1,j=index+1;i>=0&&j<=nums.size()-1;i--,j++){
// if(nums[i]==target) ans[0]=i;
// if(nums[j]==target) ans[1]=j;
// if(nums[i]!=target&&nums[j]!=target) break;
//}
for(int i=index-1,j=index+1;i>=0||j<=nums.size()-1;i--,j++){
if(i>=0&&nums[i]==target) ans[0]=i;
if(j<=nums.size()-1&&nums[j]==target) ans[1]=j;
if(i>=0&&j<=nums.size()-1&&nums[i]!=target&&nums[j]!=target) break;
}
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
int index=-1;
while(left<=right){
int mid=left+((right-left)/2);
if(nums[mid]==target){
index=mid;
break;
}
if(nums[mid]>target) right=mid-1;
if(nums[mid]<target) left=mid+1;
}
if(index==-1) return vector<int>{-1,-1};
vector<int> ans{index,index};
//for(int i=index-1,j=index+1;i>=0&&j<=nums.size()-1;i--,j++){
// if(nums[i]==target) ans[0]=i;
// if(nums[j]==target) ans[1]=j;
// if(nums[i]!=target&&nums[j]!=target) break;
//}
for(int i=index-1,j=index+1;i>=0||j<=nums.size()-1;i--,j++){
if(i>=0&&nums[i]==target) ans[0]=i;
if(j<=nums.size()-1&&nums[j]==target) ans[1]=j;
if(i>=0&&j<=nums.size()-1&&nums[i]!=target&&nums[j]!=target) break;
}
return ans;
}
};
解法二:不讲码德调用STL库函数方法
这不多说了,有时间看看得了!
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
auto [l, r] = equal_range(nums.begin(), nums.end(), target);
if (l == r) return {-1, -1};
else return {(int)(l-nums.begin()), (int)(r-nums.begin()-1)};
}
};
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
auto left = lower_bound(nums.begin(), nums.end(), target);
auto right = upper_bound(nums.begin(), nums.end(), target);
if (left == right) return vector<int>{-1, -1};
else return vector<int>{(int)(left - nums.begin()), (int)(right - nums.begin() - 1)};
}
};