34. Search for a Range
2015-07-20 22:55
447 查看
看到此题有没有想到STL中的equal_range函数,这个函数是调用lower_bound和upper_bound进行实现的。 下面我们仿写STL的实现。相比35题的二分查找,lower_bound当A[middle]
== target时,继续向左半部分查找,它返回的是第一个等于target的元素位置;upper_bound当A[middle] == target时,继续向右半部分查找,它返回的是第一个大于target的元素位置。需要注意的一点是,upper_bound之所以要返回第一个大于target的元素位置,是想与STL的函数功能保持一致。代码如下:
== target时,继续向左半部分查找,它返回的是第一个等于target的元素位置;upper_bound当A[middle] == target时,继续向右半部分查找,它返回的是第一个大于target的元素位置。需要注意的一点是,upper_bound之所以要返回第一个大于target的元素位置,是想与STL的函数功能保持一致。代码如下:
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> res(2, -1); // 创造vector res,有两个元素,数值都为-1。 int low = 0, high = (int)nums.size()-1; while(low <= high) { int middle = low + ((high - low)>>1); if(nums[middle] < target) low = middle + 1; else if(nums[middle] > target) high = middle - 1; else { res[0] = lowerBound(nums, low, middle - 1, target); res[1] = upperBound(nums, middle + 1, high, target) - 1; return res; } } return res; } // 找到范围[left,right]内第一个等于target的元素 int lowerBound(vector<int>& nums, int left, int right, int target) { int low = left, high = right; while(low <= high) { int middle = low + ((high - low)>>1); if(nums[middle] < target) low = middle + 1; else high = middle - 1; } return high + 1; // 注意这里返回值不是low } // 找到范围[left,right]内第一个大于target的元素 int upperBound(vector<int>& nums, int left, int right, int target) { int low = left, high = right; while(low <= high) { int middle = low + ((high - low)>>1); if(nums[middle] == target) low = middle + 1; else high = middle - 1; } return low; } };
相关文章推荐
- 20150720 Two heads are better than one
- ubuntu14-04升级到15-04
- poj1985 树的直径
- stuts2注解
- XMPP系列(二)----用户注册和用户登录功能
- XMPP系列(二)----用户注册和用户登录功能
- post和get提交服务器编码过程
- Uber优步北京第四组奖励政策
- Hive桶列BucketedTables
- Python进阶---一Python小测试
- mysql插入中文时候编码问题
- rosbuild
- C语言小练习
- 【整理】--【字符设备】分配设备号register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()
- 启动erlang/OTP里面的Web服务器(application INETS启动过程代码分析)
- ORA-4031错误 解决方法
- Linux脚本备忘
- 一个简单RPC框架是如何炼成的(VI)——引入服务注册机制
- javaEE第三~四天
- 状态模式