这题给了个函数 bool isBadVersion(version) 来返回当前版本(version)是正确的还是错误的,需要注意的是正确返回的是false,错误返回true。
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
long long int p=0,q=n;
while(p<q){
long long int mid=p+(q-p)/2;
if(isBadVersion(mid)){
q=mid;
}
else{
p=mid+1;
}
}
return q;
}
};
用O(n)的方法来做的话,这题就是简单题,来看看二分的做法吧
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
//特判
if(nums.size()==0){
return {-1,-1};
}
vector<int> ans(2);
ans[0]=ans[1]=-1;
//q为第一个大于target的元素的下标
//right是第一个大于等于target的元素的下标
int p=0,q=nums.size()-1;
int left=0,right=q;
//二分确定q和right位置
while(p<q){
int mid=p+(q-p)/2;
if(nums[mid]>target){
q=mid;
}
else{
p=mid+1;
}
}
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]>=target){
right=mid;
}
else{
left=mid+1;
}
}
//right==q时可能数组中没有等于target的元素,或者nums里只有一个等于target的元素
if(right!=q||right==q&&nums[q]==target){
ans[0]=right;
ans[1]=q-1;
}
if(nums[q]==target){
ans[1]++;
}
return ans;
}
};