zoukankan      html  css  js  c++  java
  • 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].

    边界条件很恶心。

    主要思想是:

    1.左边界的前一个数要小于target,右边界的后一个数要大于target

    2.如果没有边界左(右)的数,则可以直接返回

    class Solution {
    public:
        vector<int> searchRange(int A[], int n, int target) {
            vector<int> re;
            re.push_back(-1);
            re.push_back(-1);
            if(n < 1)
            {
    
                return re;
            }
            re[0]=findleft(A,n,target);
            re[1]=findright(A,n,target);
            return re;
            
    
        }
        
        int findleft(int A[],int n,int target)
        {
            int left = 0; 
            int right = n-1;
            if(A[0]==target)return 0;
            while(left <= right)
            {
                int mid = left + (right - left)/2;
                if(A[mid] == target &&( mid-1 >=0 &&A[mid-1] < target|| mid ==0))return mid;
                if(A[mid] >= target )//&& mid-1 >=0 &&A[mid-1] == target)
                {
                    right = mid -1;
                }
                else if(A[mid] < target)
                {
                    left = mid+1;
                }
            }
            return -1;
        }
        int findright(int A[],int n,int target)
        {
            int left = 0; 
            int right = n-1;
            if(A[n-1]==target)return n-1;
            while(left <= right)
            {
                int mid = left + (right - left)/2;
                if(A[mid] == target && (mid+1 <n &&A[mid+1] > target || mid+1 == n))return mid;
                if(A[mid] > target )
                {
                    right = mid -1;
                }
                else if(A[mid] <= target )//&& mid+1<n && A[mid+1]==target )
                {
                    left = mid+1;
                }
            }
            return -1;
        }
    };
    

      

  • 相关阅读:
    [Luogu 3794]签到题IV
    [JSOI 2015]最大公约数
    [BZOJ 5123][Lydsy1712月赛]线段树的匹配
    [BZOJ 5127][Lydsy1712月赛]数据校验
    [Codeforces Educational Round 71]Div. 2
    [NOIp 2018]all
    [BZOJ 2134]单选错位
    [hihoCoder 1384]Genius ACM
    [POJ 3233]Matrix Power Series
    [USACO 09FEB]Bullcow
  • 原文地址:https://www.cnblogs.com/pengyu2003/p/3667500.html
Copyright © 2011-2022 走看看