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;         
        }
    };
    
  • 相关阅读:
    windows8.1下安装Cygwin并通过apt-cyg安装软件包
    cocos2d-x 3.9 android studio项目命令行打包
    Android API Level与sdk版本对照表
    如何设置minSdkVersion和targetSdkVersion
    记录quick cocos2d-x3.2升级至cocos2d-x3.8
    [转]英语飙升的好方法
    cocos2d-x3.0rc打包apk遇到的一些问题记录
    vim显示行号、语法高亮、自动缩进的设置
    cocos2d-x在android真机上设置帧率无效的问题
    【Coding】Eclipse使用技巧
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/3129215.html
Copyright © 2011-2022 走看看