[Leetcode]_34 Search for a Range
来源:互联网 发布:换手率短线炒股软件 编辑:程序博客网 时间:2024/06/07 09:16
/** * Index: 34 * Title: Search for a Range * Author: ltree98 **/
题意是,给一个增序数组,求目标数字在数组中的位置,没有则为[-1, -1]。
当然,可以用穷举;
但是,题目中要求时间复杂度为 O(logn),
很显然的就想到二分了。
对了,还有一点就是目标数字,可能有 0个,1个,2个 … n个
所以,当找到目标值以后,还要向前,向后遍历,来找起始位置和结束位置。
但是,不可能出现中间掺杂其他数字的情况,因为它们是增序数组。
二分+前后遍历
这个方法,就是先通过二分查找,来找到其中一个,
然后,因为是增序的,所以向前后遍历,直到非目标值。
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int l = 0, h = nums.size()-1; int mid = (l+h)/2; while(l <= h) { if(nums[mid] > target) h = mid-1; else if(nums[mid] < target) l = mid+1; else { int start = mid-1, end = mid+1; while(start >= 0 && nums[start] == target) --start; while(end < nums.size() && nums[end] == target) ++end; return {start+1, end-1}; } mid = (l+h)/2; } return {-1, -1}; }};
二分
这个方法,就是通过两次二分查找,不断逼近到目标值,从而来找到目标值的首尾两个序号。
如果首尾序号值相同,则说明目标值不存在于数组中。
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int start, end; int l, h, mid; l = 0, h = nums.size()-1; while(l < h) { mid = (l+h)/2; if(target <= nums[mid]) h = mid; else l = mid+1; } start = l; l = 0, h = nums.size()-1; while(l < h) { mid = (l+h)/2; if(target >= nums[mid]) l = mid+1; else h = mid; } end = l; if(start == end) return {-1, -1}; else return {start, end-1}; }};
阅读全文
0 0
- [Leetcode]_34 Search for a Range
- LeetCode: Search for a Range
- LeetCode Search for a Range
- [Leetcode] Search for a Range
- LeetCode : Search for a Range
- [LeetCode] Search for a Range
- [Leetcode] Search for a Range
- Leetcode Search for a Range
- [LeetCode]Search for a Range
- LeetCode-Search for a Range
- [leetcode] Search for a Range
- LeetCode - Search for a Range
- Search for a Range leetcode
- LeetCode | Search for a Range
- LeetCode - Search for a Range
- LeetCode: Search for a Range
- leetcode: Search for a Range
- 【leetcode】Search for a Range
- LeetCode 72. Edit Distance
- Go编程基础—格式化
- C语言和C++的一些区别
- 部署web项目时tomcat出现 Exception in thread "main"错误
- 利用反射机制来获取表单请求值以及对象赋值(使用了第三方插件)
- [Leetcode]_34 Search for a Range
- Android自定义布局属性
- 洛谷1008
- laravel 模型关联 的简单使用方法
- Android进程通讯
- 大数据R安装依赖库
- SpringMVC数据转换
- 八幅漫画理解使用JSON Web Token设计单点登录系统
- C++使用STL中map需要注意的地方