[leetcode] 34. Search for a Range

来源:互联网 发布:飞鸽传书经典mac 编辑:程序博客网 时间:2024/05/16 01:55

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].

这道题是查找目标值在数组中的下标区间,题目难度为Medium。

时间复杂度限定为O(logn),很自然会想到用二分查找法,只是这里需要找出target的上界和下界。分别用bgn、end和mid表示查找过程中的左端、右端和中点,传统的二分查找法在nums[mid]==target时即找到结果退出,这里我们要找出上界和下界,所以不能从这里退出。在找下界时,如果nums[mid]>=target将end置为mid-1,否则将bgn置为mid+1,这样会逐渐接近target的下界,在循环结束时bgn即是target的下界。同理,在找上界时,如果nums[mid]>target将end置为mid-1,否则将bgn置为mid+1,这样会逐渐接近target的上界,在循环结束时bgn在target的上界加1的位置。如果没有查找到target,上界和下界是一样的,我们就以此来判断是否有target存在。具体代码:

class Solution {public:    vector<int> searchRange(vector<int>& nums, int target) {        int bgn = 0, end = nums.size() - 1, mid, left, right;                while(bgn <= end) {            mid = (bgn + end) / 2;            if(nums[mid] >= target) end = mid - 1;            else bgn = mid + 1;        }        left = bgn;        end = nums.size() - 1;        while(bgn <= end) {            mid = (bgn + end) / 2;            if(nums[mid] > target) end = mid - 1;            else bgn = mid + 1;        }        right = bgn;                if(left == right) return vector<int> {-1, -1};        else return vector<int> {left, right - 1};    }};

0 0
原创粉丝点击