LeetCode(34)Search for a Range
2015-08-17 16:03
399 查看
题目
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].
分析
给定一有序整数序列,与目标元素值,要求输出目标元素值在此序列中出现的范围下标。且复杂度控制在O(logn)内。明显的,我们应该采取二分搜索的思想,设计求出关键字最早出现位置与最后出现位置,与普通的二叉搜索比较,只需要修改判断条件即可。
AC代码
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> ret; if (nums.size() == 0) { ret.push_back(-1); ret.push_back(-1); return ret; } //寻找目标元素的下标 int pos = BinarySearch(nums, target); //目标元素不存在 if (pos == -1) { ret.push_back(-1); ret.push_back(-1); return ret; } else{ int left = BinarySearchLeft(nums, 0, pos, target); int right = BinarySearchRight(nums, pos, nums.size()-1 , target); ret.push_back(left); ret.push_back(right); return ret; }//if } int BinarySearch(vector<int> & nums, int target) { int left = 0, right = nums.size() - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == target) return mid; else if (nums[mid] < target) { left = mid + 1; continue; } else{ right = mid - 1; continue; } }//while return -1; } int BinarySearchLeft(vector<int> & nums, int left, int right, int target) { while (left < right) { int mid = (left + right) / 2; if (nums[mid] == target && nums[mid-1] < target) return mid; else if (nums[mid] < target) { left = mid + 1; continue; } else{ right = mid - 1; continue; } }//while return left; } int BinarySearchRight(vector<int> & nums, int left, int right, int target) { while (left < right) { int mid = (left + right) / 2; if (nums[mid] == target && nums[mid + 1] > target) return mid; else if (nums[mid] <= target) { left = mid + 1; continue; } else{ right = mid - 1; continue; } }//while return right; } };
GitHub测试程序源码
相关文章推荐
- 关于Oracle在where子句中引用列别名问题的分析
- LINGO出错时错误代码含义:
- 线段树专题—ZOJ1610 Count the Colors
- Java基本数据类型总结
- 1094. The Largest Generation (25)
- 安卓 SurfaceView 画图
- Getting started with Javacc
- 消息智能路由组件SmartRoute
- 计算两个字符串的最长公共字串长度(java编程)
- bootstrap布局 网格系统
- sqlserver 已超过了锁请求超时时段 1222错误
- 百度笔试题:求序列里最长的非降序列
- bootstrap布局 网格系统
- 苹果笔记本win7系统触摸板无法右键功能
- 关于MYsql命令行编辑器的提示符含义--退出错误解决
- exchange 2016 系统要求
- spark standalone zookeeper HA部署方式
- spark standalone zookeeper HA部署方式
- spark standalone zookeeper HA部署方式
- UIWebView与js交互(二)