Leetcode 二分查找
1.Search for a Range
参考剑指offer 面试题38
class Solution {
public:
vector<int> searchRange(int A[], int n, int target)
{
vector<int>index;
int low=0,high=n-1;
int m;
while(low<=high)
{
m=low+(high-low)/2;
if(A[m]==target)
{
int i,j;
for(i=m;i>=0&&A[i]==target;i--);
index.push_back(i+1);
for(j=m;j<n&&A[j]==target;j++);
index.push_back(j-1);
break;
}
if(A[m]>target)high=m-1;
if(A[m]<target)low=m+1;
}
if(index.size()==0)
{
index.push_back(-1);
index.push_back(-1);
}
return index;
}
};
改进版代码
class Solution {
public:
int FindLast(int A[],int low,int high,int data)
{
int mid = low + (high-low)/2;
if(high>=low)
{
if(mid==high && A[mid]== data || A[mid]==data && A[mid+1]> data)
return mid;
else
{
if(A[mid]<=data)
{
return FindLast(A,mid+1,high,data);
}
else
{
return FindLast(A,low,mid-1,data);
}
}
}
return -1;
};
int FindFirst(int A[],int low,int high,int data)
{
int mid = low + (high-low)/2;
if(high>=low)
{
if(mid==low && A[mid]== data || A[mid]==data && A[mid-1]< data)
return mid;
else
{
if(A[mid]>=data)
{
return FindFirst(A,low,mid-1,data);
}
else
{
return FindFirst(A,mid+1,high,data);
}
}
}
return -1;
};
vector<int> searchRange(int A[], int n, int target) {
int first;int last;
vector<int> V;
first= FindFirst(A,0,n-1,target);
last= FindLast(A,0,n-1,target);
//printf("%d %d",first,last);
V.push_back(first);
V.push_back(last);
return V;
}
};
II Search in Rotated Sorted Array
很好的一道题
class Solution {
public:
int search(int A[], int n, int target)
{
int index=-1;
int low=0,high=n-1;
int m;
while(low<=high)
{
m=low+(high-low)/2;
if(A[m]==target)
{
return m;
}
if(A[m]>target)
{
if(A[low]<=A[m]&&A[low]>target)
low=m+1;
else high=m-1;
}
if(A[m]<target)
{
if(A[high]>=A[m]&&A[high]<target)
high=m-1;
else low=m+1;
}
}
return index;
}
};
III Search in Rotated Sorted Array II
同样很好的一道题
class Solution {
public:
bool search(int A[], int n, int target)
{
int low=0,high=n-1;
int m;
if(A[low]==A[high])
{
if(A[low]==target)return true;
while(A[low]==A[high]&&low<n)low++;
}
while(low<=high)
{
m=low+(high-low)/2;
if(A[m]==target)
{
return true;
}
if(A[m]>target)
{
if(A[low]<=A[m]&&A[low]>target)
low=m+1;
else high=m-1;
}
if(A[m]<target)
{
if(A[high]>=A[m]&&A[high]<target)
high=m-1;
else low=m+1;
}
}
return false;
}
};
浙公网安备 33010602011771号