LeetCode || Search for a Range

来源:互联网 发布:mac终端连接阿里云 编辑:程序博客网 时间:2024/06/10 03:08

使用二分查找算法,但是遇到求解范围的时候遇到瓶颈。先用顺序搜索求解。

时间:20ms。

class Solution {public:    vector<int> searchRange(vector<int>& nums, int target) {        int i = 0, j = nums.size()-1;        int mid = (i+j)/2;                vector<int> range;        range.push_back(-1);        range.push_back(-1);        while(i <= j)        {            if(nums[mid] == target)//            {                range[0] = i;                range[1] = j;                break;            }            else if(nums[mid] > target)            {                j = mid-1;                mid = (i + j)/2;            }            else            {                i = mid+1;                mid = (i+j)/2;            }        }                        while(range[0] < nums.size() && nums[range[0]] != target)            range[0]++;        while(range[1] < nums.size() && nums[range[1]] != target)            range[1]--;        return range;    }};

从后往前搜索,时间提高,变为12ms、

class Solution {public:    vector<int> searchRange(vector<int>& nums, int target) {        int i = 0, j = nums.size()-1;        int mid = (i+j)/2;                vector<int> range;        range.push_back(-1);        range.push_back(-1);        while(i <= j)        {            if(nums[mid] == target)//            {                //从i到mid搜索第一个target                int tmp = mid -1;                while(tmp >= 0 && nums[tmp] == target)                    tmp--;                                    range[0] = tmp+1;                                //从mid到j搜索最后一个target                tmp = mid + 1;                while(tmp < nums.size() && nums[tmp] == target)                    tmp++;                range[1] = tmp-1;;                break;            }            else if(nums[mid] > target)            {                j = mid-1;                mid = (i + j)/2;            }            else            {                i = mid+1;                mid = (i+j)/2;            }        }        return range;    }};

递归方法实现二分搜索;耗时12ms。

class Solution {public:    vector<int> searchRangeCore(vector<int>& nums, int s, int e, int target)    {        int mid = (s+e)/2;                vector<int> range;        range.push_back(-1);        range.push_back(-1);                    if(nums[s] == target && nums[e] == target)        {            range[0] = s;            range[1] = e;            return range;        }                while(s <= e)        {            if(nums[mid] == target)//            {                //从s到mid搜索第一个target                vector<int> r1 = searchRangeCore(nums, s, mid, target);                                //从mid到e搜索最后一个target                vector<int> r2 = searchRangeCore(nums, mid+1, e, target);                                //联合r1和r2                if(r1 == range)                    range = r2;                if(r2 == range)                    range = r1;                if(r1[1] == r2[0]-1)                {                    range[0] = r1[0];                    range[1] = r2[1];                }                break;            }            else if(nums[mid] > target)            {                e = mid-1;                mid = (s + e)/2;            }            else            {                s = mid+1;                mid = (s+e)/2;            }        }        return range;    }    vector<int> searchRange(vector<int>& nums, int target) {        return searchRangeCore(nums, 0, nums.size()-1, target);    }};



0 0
原创粉丝点击