算法课第十四周作业 | Search for a Range

来源:互联网 发布:可视化常用数据集 编辑:程序博客网 时间:2024/06/08 07:07

写在前面:

选取题目34,采用二分法实现。


题意解读:

给定一个升序整数数组和一个目标整数target。

求目标整数在这个数组中的起始位置和结束位置。

如果找不到返回[-1,-1]

要求算法复杂度是log(n)


解题思路:

由于数组是升序数组,可以拆解分两步进行,先找到起始位置,再找到结束位置。

通过二分法先找到起始位置begin,方法是找到最接近并且小于target整数来确定。

即每次取中间位置值mid与target比较,小于target则将begin设置为mid,大于等于则将end设置为mid。

第二步找结束位置同样是二分法,方法是找到最接近并且大于target整数位置来确定。

即每次取begin和end的中间位置值于target比较,等于target则将begin设置为mid,大于则将end设置为mid。

需要注意的是,二分法当begin = end-1时满足循环条件会进入死循环,这时需要加条件判断来使之跳出。


代码:

#include <iostream>#include <vector> using namespace std;class Solution {public:    vector<int> searchRange(vector<int>& nums, int target) {    if(nums.size() == 0)    {    return vector<int>(2, -1);    }    vector<int> result;    int begin = 0;    int end = nums.size()-1;    int mid;    while(begin < end)    {    mid = (begin + end) / 2;    if(target > nums[mid])    {    begin = mid + 1;    }    else    {    end = mid;    }    }    if(nums[begin] != target)    {    return vector<int>(2, -1);    }    result.push_back(begin);    end = nums.size()-1;        while(begin < end)    {    if(begin == end - 1)    {    if(target == nums[end])    {    break;    }    else    {    end = end - 1;    break;    }    }    mid = (begin + end) / 2;    if(target == nums[mid])    {    begin = mid;    }    else    {    end = mid - 1;    }    }    result.push_back(end);        return result;    }};int main(){int a[6] = {8, 8, 8, 8, 8, 9};vector<int> test(a, a+6);Solution ss;vector<int> result = ss.searchRange(test, 9);cout << result[0] << "," <<  result[1] << endl;return 0;}

运行截图: