• 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;         
        }
    };
    
  • 相关阅读:
    Java 重载机制
    网关、DNS、子网掩码、MAC地址、路由器、猫
    前台?后台?前端?后端?
    JSP初学
    PS笔记
    Pandorabox等类OpenWrt的路由器 实现后端设备接入IPV6(中继代理+NAT)
    三星S5_G9008V 解锁联通4G(安卓6.0)
    一个意外的发现
    硬改路由器-MW310R-AR9341篇
    关于使用硬改的路由器的各种经历
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/3129215.html
Copyright © 2020-2023  润新知