34. Search for a Range--Array/LeetCode/C++

来源:互联网 发布:软件产品质量承诺 编辑:程序博客网 时间:2024/06/09 20:03

34. Search for a Range

先“二分法找“匹配的第一个数”;再“二分法从“部分区域(匹配的第一个数,全体的最后一个数)”里找“匹配的最后一个数”。

关键:二分法

注意:第一次找时,从右向左找,把high尽量向左移(找第一个数);第二次找时,从左向右找,把high尽量向右移(找最后一个数);

class Solution {public:    vector<int> searchRange(vector<int>& nums, int target)     {        int sz = nums.size();        if(sz == 0)            return vector<int>({-1, -1});        vector<int> ret;        int low  = 0;        int high = sz - 1;                // 找第一个数        while(low <= high)        {            int mid = (low + high) / 2;            if(nums[mid] >= target)    // 从右向左遍历,找第一个数 (包括=号是为了退出循环)                high = mid - 1;        // 找到时,high变了,low没变            else                low = mid + 1;        }                // 定位第一个数的下标        if(low < sz && nums[low] == target)//因为找到时,high变了,low没变,故用low定位第一个数             ret.push_back(low);        else            return vector<int>({-1, -1});                    // 找第二个数        low = low;        high = sz - 1;        while(low <= high)        {            int mid = (low + high) / 2;            if(nums[mid] <= target)    // 从左(第一个数)向右遍历,找最后一个数(包括=号是为了退出循环)                low = mid + 1;            else                high = mid - 1;        }                ret.push_back(high);        return ret;        // 定位第二个数的下标    }};


题目:

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

39%


思路:

0 0
原创粉丝点击