zoukankan      html  css  js  c++  java
  • 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;         
        }
    };
    
  • 相关阅读:
    fedora中将程序的快捷方式添加到“应用程序”中的方法
    Windows PHP 中 VC6 X86 和 VC9 X86 的区别及 Non Thread Safe 的意思
    Fedora/Centos升级Python由2.7到3.2
    MVC模式小结
    使用MVVM模式的WPF应用(翻译文章)
    WPF的数据绑定
    关于cookie、session、application知识 的整理
    C#中关于Module和Assembly的关系
    c#接口和抽象类的一些概念
    23种设计模式(超级简洁)
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/3129215.html
Copyright © 2011-2022 走看看