leetcode之路034 Search for a Range
2015-09-13 10:07
218 查看
题目大意:给定一个已排序的数组,找到给定目标值在数组中出现的起始和结束位置。算法的时间复杂度要求是O(logn)。
假如没有找到,则返回[-1,-1]。
例:[5, 7, 7, 8, 8, 10],给定值8,返回[3,4]。给定值为9,返回[-1,-1]。
很简单的题目,思路:
1、对于给定的值,用lower_bound返回其初始位置;
2、用upper_bound返回其结束位置的下一个位置。
3、假如两个值相等,则证明没有找到,返回[-1,-1]。否则,返回[a,b-1]。
提交ac的代码如下,非常简洁,运行时间12ms:
上述使用STL函数实现的二分查找,本着锻炼自己代码的能力,不用STL函数,自己实现了一下,也挺简单的,主要是用了两个二分查找,需要注意的是,判断的条件不同,因此求出的查找位置不同。下面是改写的代码,时间也是12ms:
假如没有找到,则返回[-1,-1]。
例:[5, 7, 7, 8, 8, 10],给定值8,返回[3,4]。给定值为9,返回[-1,-1]。
很简单的题目,思路:
1、对于给定的值,用lower_bound返回其初始位置;
2、用upper_bound返回其结束位置的下一个位置。
3、假如两个值相等,则证明没有找到,返回[-1,-1]。否则,返回[a,b-1]。
提交ac的代码如下,非常简洁,运行时间12ms:
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> resu; int a=lower_bound(nums.begin(),nums.end(),target)-nums.begin(); int b=upper_bound(nums.begin(),nums.end(),target)-nums.begin(); if(a==b) { resu.push_back(-1); resu.push_back(-1); } else if(a<b) { resu.push_back(a); resu.push_back(b-1); } return resu; } };
上述使用STL函数实现的二分查找,本着锻炼自己代码的能力,不用STL函数,自己实现了一下,也挺简单的,主要是用了两个二分查找,需要注意的是,判断的条件不同,因此求出的查找位置不同。下面是改写的代码,时间也是12ms:
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> resu; if(nums.size()==0) return resu; int m=0,n=nums.size()-1,mid; while(m<=n) { mid=(m+n)/2; if(nums[mid]<target) m=mid+1; else n=mid-1; } int a=m; m=0,n=nums.size()-1; while(m<=n) { mid=(m+n)/2; if(nums[mid]>target) n=n-1; else m=mid+1; } int b=m; if(a==b) { resu.push_back(-1); resu.push_back(-1); } else if(a<b) { resu.push_back(a); resu.push_back(b-1); } return resu; } };
相关文章推荐
- ffmpeg配置
- Raft一致性算法
- iredmail centos下简要安装指南
- Unity3D笔记第十天——刚体及物理材质
- sizeof()数组名和指针的结果
- [原]MySQL日志
- C++ 利用类模板---类继承形成多态----的一个异常处理结构
- Java基础-----常用API
- [C++]虚函数的虚继承
- 第二周项目二 程序的多文件组织
- SDWebImage-实现原理
- 天猫淘宝:直通车霸占搜索结果前十页前三结果
- 排序算法——冒泡排序
- 单链表(六)——判断链表是否含环
- C#—接口 PK 抽象类
- 天天团购--源码目录结构
- Hypergraph Models超图模型
- Hypergraph Models超图模型
- c++文件操作总结
- C语言笔记杂记