第一题
看到了这句话
但是实现起来一直有问题,首先是二分查找边界问题,然后就是我认为如果这一半是有序的,就二分查找,如果没找到就是在另一半无序那里,但是实际上没找到可能是的确就是不存在target,这样就会陷入死循环。
int bisearch(int l,int r,int* nums,int target){
while(l<r){
int m=(l+r)/2;
if(nums[m]==target) return m;
if(nums[m]>target) r=m;
else l=m;
}
return -1;
}
int f(int l,int r,int* nums,int target){
int m=(l+r)/2;
int ans;
if(nums[l]<nums[m]){
ans=bisearch(l,m,nums,target);
if(ans==-1) f(m+1,r,nums,target);
else return ans;
}
if(nums[m+1]<nums[r]){
ans=bisearch(m+1,r,nums,target);
if(ans==-1) f(l,m,nums,target);
else return ans;
}
return -1;
}
int search(int* nums, int numsSize, int target){
int l=0;
int r=numsSize-1;
return f(l,r,nums,target);
}
改了快两个小时,终于算写出来了,二分太tm难了
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = (int)nums.size();
if (!n) {
return -1;
}
if (n == 1) {
return nums[0] == target ? 0 : -1;
}
int l=0;
int r=n-1;
int m=(l+r)/2;
while(l<=m){
if(target==nums[m]) return m;
if(nums[l]<=nums[m]){
if(target>=nums[l]&&target<=nums[m]){
r=m;
}
else l=m+1;
}
else{
if(target>=nums[m]&&target<=nums[r]){
l=m;
}
else r=m-1;
}
m=(l+r)/2;
}
return -1;
}
};
第二题
第三题
第四题