LeetCode——Search for a Range

来源:互联网 发布:怎么在淘宝买ps4gta5 编辑:程序博客网 时间:2024/05/17 02:18

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 ofO(logn).

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,-1]。

这里要注意的是我们只能用时间复杂度为O(log n)或者更少的算法解决本题。
其实O(log n)也是这题的一个提示,我们只需要对给定的数组进行最多一次的遍历就能解决这个问题。
代码如下:

class Solution {public:    vector<int> searchRange(vector<int>& nums, int target) {        int len = nums.size();        int low = 0;        int high = len-1;        vector<int> result;        while(low <= high) {        int mid = (low+high)/2;        if(nums[mid] == target) {        int min = mid;        while(min>=0 && nums[min]==nums[mid])            min--;        int max = mid;        while(max<=high && nums[max]==nums[mid])            max++;        result.push_back(min+1);        result.push_back(max-1);        return result;}else if(nums[mid] > target) {high = mid-1;}else if(nums[mid] < target) {low = mid+1;}}result.push_back(-1);result.push_back(-1);return result;    }};

起初先规定low为0,high为数组的大小减1。然后确定mid的值为两者相加除以2。用nums[mid]的值和目标值比较,如果相等就直接分别向下向上遍历找到下界和上界即可(直到nums[min]的值小于目标值/nums[max]的值大于目标值),如果nums[mid]的值比目标值大,就可以确定上界在当前的mid之下,可以把上界赋值为当前mid值再减1然后确定新的mid值然后继续寻找上界下界。如果nums[mid]的值比目标值小,就可以确定下界在当前的mid之上,就可以把下界赋值为当前mid值再加1然后继续去寻找。

在while循环外面进行把两个-1放到result向量中,意义就是如果找不到目标值的话就返回[-1 -1],也就是题目的要求。

最后返回声明的result向量就可以了。