34. Search for a Range
2016-05-20 11:38
288 查看
题目:
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return
For example,
Given
return
题意:
给定一个排好序的整数数组,找到给定目标target的开始和结束位置。
算法的时间复杂度在O(log n)之间。如果target值在数组中没有找到,则返回[-1,
-1].
思路一:
因为数组已经是排序之后的,所以跳过小于target的部分,记录target的个数,之后当前下标即为end,下标-count就为start。
代码:13ms
因为数组已排序,故先采用二分查找,找到第一个target元素所在位置,之后直接如果下一个元素还是等于target,则下标加1;
代码:12ms
思路三:
利用两次二分查找,分别查找出start,end下标
代码:12ms
8ms C++解法????
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
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].
题意:
给定一个排好序的整数数组,找到给定目标target的开始和结束位置。
算法的时间复杂度在O(log n)之间。如果target值在数组中没有找到,则返回[-1,
-1].
思路一:
因为数组已经是排序之后的,所以跳过小于target的部分,记录target的个数,之后当前下标即为end,下标-count就为start。
代码:13ms
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> result(2, -1); int count=0; int i = 0; while(nums[i]<target){ //跳过小于target的部分 i++; } while(nums[i]==target && i<nums.size()){ //记录target出现次数 i++; count++; } if(count==0){ //若未出现,则返回[-1,-1] return result; } result[0] = i-count; result[1] = i-1; return result; } };思路二:
因为数组已排序,故先采用二分查找,找到第一个target元素所在位置,之后直接如果下一个元素还是等于target,则下标加1;
代码:12ms
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> result(2, -1); int count=0; int start = 0; int end = nums.size()-1; while(start<end){ //二分查找到第一个target元素 int mid = (start+end)/2; if(nums[mid]<target){ start = mid+1; }else{ end = mid; } } if(nums[start]!=target){ //没有找到target,返回[-1,-1] return result; }else{ result[0] = start; //找到第一个target,保存其start下标 } while(nums[start]==target && start<nums.size()){ //找到target的end start++; } result[1] = start-1; return result; } };
思路三:
利用两次二分查找,分别查找出start,end下标
代码:12ms
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> result(2, -1); int count=0; int start = 0; int end = nums.size()-1; while(start<end){ int mid = (start+end)/2; if(nums[mid]<target){ start = mid+1; }else{ end = mid; } } if(nums[start]!=target){ return result; }else{ result[0] = start; } end = nums.size()-1; while(start<end){ int mid = (start+end)/2 + 1; //加1的目的是使mid中间值偏向右 if(nums[mid]>target){ end = mid-1; }else{ start = mid; } } result[1] = end; return result; } };思路四:
8ms C++解法????
相关文章推荐
- C++第五次实验
- c++作业6
- caffe学习笔记(4):lr_policy之各模型形式的总结
- Caused by: java.lang.OutOfMemoryError: PermGen space
- easy UI 前端分页
- 判断给定的时间是否满足表达式
- Log4j自定义Appender介绍
- C++ string类型详解
- 技术名词
- MemCache详细解析
- Zabbix监控tomcat
- Python super()深度思考
- Android参考资料
- 获取短信验证码
- Android自定义View仿加速球
- 开发无框架单页面应用
- c++第6次作业
- java后台 调用接口post参数实例
- ShareSDK微信支付成功不调用onResp、openURL、handleOpenURL等方法
- Drill sql 关键字