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

 

 

 

 

 

 

posted @ 2013-06-09 15:02  代码改变未来  阅读(163)  评论(0编辑  收藏  举报