Search for a Range 题解

2017-06-02  本文已影响0人  BookThief

题目描述

Given an array of integers sorted in ascending order, 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].

给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
给出[5, 7, 7, 8, 8, 10]和目标值target=8,
返回[3, 4]

代码及注释

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        // lower_bound函数找到第一个大于或者等于target的位置
        int left = distance(nums.begin(),lower_bound(nums.begin(),nums.end(),target));
        // upper_bound函数找到第一个大于target的位置
        int right = distance(nums.begin(),prev(upper_bound(nums.begin(),nums.end(),target)));
        // 上述函数可能返回last
        if(nums[left] != target)
            return vector<int> {-1,-1};
        else    
            return vector<int> {left,right};
    }
};

分析

有序数组的查找问题,一般都采用二分法求解。但此处我们直接使用STL模板里的函数帮助我们。实际上这两个函数本身也是二分法实现的。下面介绍一下这两个函数。

(注意这两个函数返回的是一个迭代器,不可以直接赋值为int类型,需要通过distance函数转换)

上一篇 下一篇

猜你喜欢

热点阅读