题目

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测试程序源码

最新文章

  1. Preconditions优雅的检验参数
  2. POJ2186 Popular Cows(强连通分量)
  3. HDU 1025-Constructing Roads In JGShining&#39;s Kingdom(最长不降子序列,线段树优化)
  4. 在Dashboard中显示课表/日程表
  5. 线段树求逆序数方法 HDU1394&amp;amp;&amp;amp;POJ2299
  6. g++编译cpp文件
  7. 我的第一本docker书-阅读笔记
  8. Swift、Objective-C 单例模式 (Singleton)
  9. __builtin_popcount(n)
  10. Linux通过shell执行自动化部署
  11. python3 re正则匹配数据获取案例
  12. Leetcode-颠倒整数
  13. CodeForces - 724G:Xor-matic Number of the Graph
  14. 先安装VS后安装IIS,注册IIS方法
  15. 从零开始学安全(十五)●DHCP服务
  16. VirtualBox下扩容vdi文件
  17. 使用antd-mobile的ImagePicker组件实现图片的上传
  18. Web服务架构风格之REST
  19. 【二分】【预处理】zoj4029 Now Loading!!!
  20. Django之Form组件验证

热门文章

  1. 跟我一起玩Win32开发(3):窗口的重绘
  2. C++ 操作符重载 (operator)
  3. phpcms v9模板制作教程
  4. void运算符
  5. 动态栅格(DEM)图层实现服务端渲染
  6. Java单例模式的6种写法
  7. PMP项目管理学习笔记(8)——整个管理之监控项目工作、综合变更控制、结束项目或阶段
  8. JS正则表达式匹配&lt;div&gt;&lt;style&gt;标签
  9. PHP一句话后门过狗姿势万千之传输层加工
  10. Java 游戏报错 看不懂求教