61 搜索区间

原题网址:https://www.lintcode.com/problem/search-for-a-range/description

描述

给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。

如果目标值不在数组中,则返回[-1, -1]

您在真实的面试中是否遇到过这个题?  

样例

给出[5, 7, 7, 8, 8, 10]和目标值target=8,

返回[3, 4]

挑战

时间复杂度 O(log n)

标签
二分法
数组
排序数组
 
思路:二分查找,找到后用两根指针分别向前移动找到起始位置、向后移动找到结束位置。注意边界元素。
初始代码没有考虑空集或者没找到的情况囧……考虑问题还是要全面,不能因为做过类似的题就大意。
start、end初值设为-2是为了判断是否在数组中找到target,初值不为-1是因为找到后若起始位置为0 start会变成-1,但end不会,所以如果判断条件是 start==-1&&end==-1 初值也可以都是-1……
 
AC代码:
class Solution {
public:
    /**
     * @param A: an integer sorted array
     * @param target: an integer to be inserted
     * @return: a list of length 2, [index1, index2]
     */
    vector<int> searchRange(vector<int> &A, int target) {
        // write your code here
        int size=A.size();
    int left=0,right=size-1,middle=(left+right)/2;
    int start=-2,end=-2;
    vector<int> result(2,-1);
    //二分查找;
    while(left<=right)
    {
        if (A[middle]==target)
        {
            start=middle;
            end=middle;
            while(start>=0&&A[start]==target)
            {
                start--;
            }
            while(end<=size-1&&A[end]==target)
            {
                end++;
            }
            break;
        }
        else if (A[middle]<target)
        {
            left=middle+1;
            middle=(left+right)/2;
        }
        else
        {
            right=middle-1;
            middle=(left+right)/2;
        }
    }
    if (start==-2&&end==-2)//没找到;
    {
        return result;
    }
    start+=1;
    end-=1;
    result[0]=start;
    result[1]=end;
    return result;
    }
};


还可以使用库函数 lower_bound和upper_bound,参考:https://blog.csdn.net/wangyuquanliuli/article/details/46642637

C++中lower_bound函数和upper_bound函数

 

原文地址:https://www.cnblogs.com/Tang-tangt/p/9122471.html