第九周算法分析与设计: Search for a Range

来源:互联网 发布:上海去哪买钢琴 知乎 编辑:程序博客网 时间:2024/06/06 02:48

问题描述:

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 of O(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].

问题来自此处


解答思路:
一看到题目要求时间复杂度是O(logn),又是跟查找相关的,还能想到什么办法呢~当然是二分法啦!
我的思路是先找到目标数,然后往目标数的左右分别延伸查找,定下相同数所在的上下界。

vector<int> searchRange(vector<int>& nums, int target) {        vector<int> result(2,-1); //初始化为[-1,-1]        int size = nums.size();        if(size == 0){            return result;        }        int low = 0, high = size - 1, med;        while(low <= high){            med = (low + high) / 2;            if(nums[med] == target){                int left = find_bound(nums,0,med,target);                int right = find_bound(nums,size,med,target);                result.clear();                result.push_back(left);                result.push_back(right);                return result;            }            else if(nums[med] < target){                low = med + 1;            }            else{                high = med - 1;            }        }        return result;    }    int find_bound(vector<int> nums,int numb,int med,int target){        int res = med;        if(numb<=med){            for(int i = med;i >= numb;i--){                if(nums[i] == target)                    res = i;                if(nums[i] < target)                    break;            }        }        else{            for(int i = med;i < numb;i++){                if(nums[i] == target)                    res = i;                if(nums[i] > target)                    break;            }        }        return res;    }

写得很煞笔。。我以为运行时间的排名铁定会被排在最后那批。。结果居然在中间……有毒有毒~

0 0