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; } };