• [LeetCode] Search for a Range 二分搜索


    Given a sorted array of integers, find the starting and ending position of a given target value.

    Your algorithm's runtime complexity must be in the order of O(log n).

    If the target is not found in the array, return [-1, -1].

    For example,
    Given [5, 7, 7, 8, 8, 10] and target value 8,
    return [3, 4].

    Hide Tags
     Array Binary Search
     
        这道是变形的二分搜索,写的有点冗余,没有很好的合并在一起。
      方法是先二分搜索到 其中一个target, 然后分别二分搜索边界。
    #include <vector>
    #include <iostream>
    using namespace std;
    
    class Solution {
    public:
        vector<int> searchRange(int A[], int n, int target) {
            vector<int > ret(2,-1);
            if(n<1) return ret;
            int mid = helpFun(A,0,n-1,target);
            if(mid !=-1){
                ret[0]=helpLeft(A,0,mid,target);
                ret[1]=helpRight(A,mid,n-1,target);
            }
            return ret;
        }
    
        int helpLeft(int *a,int lft, int rgt, int & tar)
        {
            if(a[lft]==tar) return lft;
            if(lft+1==rgt)  return rgt;
            int mid = (lft+rgt)/2;
            if(a[mid]==tar) return helpLeft(a,lft,mid,tar);
            else    return helpLeft(a,mid,rgt,tar);
        }
    
        int helpRight(int *a,int lft, int rgt, int & tar)
        {
            if(a[rgt]==tar) return rgt;
            if(lft+1==rgt)  return lft;
            int mid = (lft+rgt)/2;
            if(a[mid]==tar) return helpRight(a,mid,rgt,tar);
            else    return helpRight(a,lft,mid,tar);
        }
    
        int helpFun(int *a,int lft, int rgt, int & tar)
        {
            if(lft>rgt) return -1;
            if(lft == rgt){
                if(tar==a[lft]) return lft;
                return -1;
            }
            if(lft +1 == rgt){
                if(a[lft]==tar) return lft;
                if(a[rgt]==tar) return rgt;
                return -1;
            }
            int mid = (lft+rgt)/2;
            if(a[mid]==tar) return mid;
            if(a[mid]<tar)  return helpFun(a,mid+1,rgt,tar);
            else    return helpFun(a,lft,mid-1,tar);
        }
    };
    
    int main()
    {
        int A[]={5, 7, 7, 8, 8, 10};
        Solution sol;
        vector<int > ret = sol.searchRange(A,sizeof(A)/sizeof(int),8);
        cout<<ret[0]<<ret[1]<<endl;
        return 0;
    }

    附件是一份集成的比较好的,思路是一样:

    vector<int> searchRange(int a[], int n, int target) {
            vector<int> result(2,-1);
            int left = INT_MAX;
            int right = INT_MIN;
            binSearch(a, 0 , n-1, n, target, left, right);
            if (left != INT_MAX && right != INT_MIN) {
                result[0] = left;
                result[1] = right;
            }
            return result;
        }
        void binSearch(int a[], int l ,int h, int n, int target, int& left, int& right) {
            if (l > h) return;
    
            int m = (l+h)/2;
            if (a[m] > target) {
                binSearch(a,l,m-1,n,target, left, right);
            } else if (a[m] < target) {
                binSearch(a,m+1,h,n,target, left, right);
            } else {
                if (m < left) {
                    left = m;
                    if (m > 0 && a[m-1] == target) {
                        binSearch(a,l,m-1,n,target,left,m);
                    }
                }
                if (m > right) {
                    right  = m;
                    if (m < n-1 && a[m+1] == target) {
                        binSearch(a,m+1,h,n,target,m,right);
                    }
                }
            }
        }
    View Code
     
  • 相关阅读:
    Hibernate(7)关联关系_单向1对n
    Hibernate(6)关联关系_单向n对1
    Hibernate(5)session的方法
    Hibernate(4)简单的HelloWorld
    Hibernate(3)配置文件hibernate.cfg.xml
    Hibernate(2)映射文件Xxx-hbm.xml
    hadoop和spark的区别
    Elasticsearch的乐观并发控制和分片管理
    ArrayAdapter requires the resource ID to be a TextView
    activity打开失败,Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
  • 原文地址:https://www.cnblogs.com/Azhu/p/4357838.html
Copyright © 2020-2023  润新知