题目:

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].

代码:

class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ret;
int pos = Solution::findPos(nums, target, , nums.size()-);
if ( pos==- )
{
ret.push_back(-);
ret.push_back(-);
return ret;
}
int l = Solution::findLeft(nums, target, , pos);
ret.push_back(l);
int r = Solution::findRight(nums, target, pos+, nums.size()-);
ret.push_back(r);
return ret;
}
static int findPos(vector<int>& nums, int target, int begin, int end)
{
if ( begin>end ) return -;
int mid = (begin+end)/;
if ( nums[mid]==target ) return mid;
if ( nums[mid]>target )
{
return Solution::findPos(nums, target,begin,mid-);
}
else
{
return Solution::findPos(nums, target, mid+, end);
}
}
static int findLeft(vector<int>& nums, int target, int begin, int end)
{
if ( begin>end ) return begin;
int mid = (begin+end)/;
if ( nums[mid]<target )
{
return Solution::findLeft(nums, target, mid+, end);
}
else
{
return Solution::findLeft(nums, target, begin, mid-);
}
}
static int findRight(vector<int>& nums, int target, int begin, int end)
{
if ( begin>end ) return end;
int mid = (begin+end)/;
if ( nums[mid]>target )
{
return Solution::findRight(nums, target, begin, mid-);
}
else
{
return Solution::findRight(nums, target, mid+, end);
}
}
};

tips:

按照常规的思路写的。

1. 首先二分查找target变量的某个位置,如果没有则直接返回-1

2. 确定有target变量了,则分左右两边找

  1)左侧:找最左边的target的元素

  2)右侧:找最右边的target元素

注意处理好边界的case。

=================================

学习了一种STL的写法 代码如下:

class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ret;
const int l = std::distance(nums.begin(), std::lower_bound(nums.begin(), nums.end(), target));
const int u = std::distance(nums.begin(), std::upper_bound(nums.begin(), nums.end(), target));if (nums[l]!=target)
{
ret.push_back(-);
ret.push_back(-);
}
else
{
ret.push_back(l);
ret.push_back(u>?u-:);
}
return ret;
}
};

非常简洁。

不知道为什么,在mac的sublime上coding时,prev() next() 这俩函数一直不让用。

=============================================

第二次过这道题,就是用二分查找的思路。找左边界,右边界。代码比第一次过的时候简洁一些。

class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ret;
int l = -;
int r = -;
int begin = ;
int end = nums.size()-;
// search for left bound
while ( begin<=end )
{
int mid = (begin+end)/;
if ( nums[mid]==target )
{
l = mid;
end = mid-;
}
else if ( nums[mid]>target )
{
end = mid-;
}
else
{
begin = mid+;
}
}
if ( l==- ) { ret.push_back(l); ret.push_back(r); return ret; }
// search for right bound
begin = l;
end = nums.size()-;
while ( begin<=end )
{
int mid = (begin+end)/;
if ( nums[mid]==target )
{
r = mid;
begin = mid+;
}
else
{
end = mid-;
}
}
ret.push_back(l);
ret.push_back(r);
return ret;
}
};

【Search for a Range】cpp的更多相关文章

  1. leetcode 【 Search for a Range 】python 实现

    题目: Given a sorted array of integers, find the starting and ending position of a given target value. ...

  2. 【Search a 2D Matrix】cpp

    题目: Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the f ...

  3. 【String to Integer (atoi) 】cpp

    题目: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ca ...

  4. Hdu 4738【求无向图的桥】.cpp

    题目: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸葛亮把所有炸弹都带走了,只留下 ...

  5. 【Merge K Sorted Lists】cpp

    题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...

  6. 【Merge Two Sorted Lists】cpp

    题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...

  7. 【Largest Rectangle in Histogram】cpp

    题目: Given n non-negative integers representing the histogram's bar height where the width of each ba ...

  8. 【Binary Tree Inorder Traversal】cpp

    题目: Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary ...

  9. 【Binary Tree Preorder Traversal】cpp

    题目: Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binar ...

随机推荐

  1. Hive中的排序语法

    ORDER BY hive中的ORDER BY语句和关系数据库中的sql语法相似.他会对查询结果做全局排序,这意味着所有的数据会传送到一个Reduce任务上,这样会导致在大数量的情况下,花费大量时间. ...

  2. PHP计算某个目录大小的方法

    用PHP来计算某个目录大小的方法. PHP CURL session COOKIE  可以调用系统命令,还可以这样:  <?php function dirsize($dir) {  @$dh  ...

  3. PHP 下载文件时自动添加bom头的方法

    首先弄清楚,什么是bom头?在Windows下用记事本之类的程序将文本文件保存为UTF-8格式时,记事本会在文件头前面加上几个不可见的字符(EF BB BF),就是所谓的BOM(Byte order ...

  4. Nob畅想在线教育

    1.社交网络的课堂实时互动 老师上课,每当和同学们互动时大家下边总是保持沉默,低着头,几乎每人拿着一部手机在看,还有pad等. 张星老师的课算是好一点,学生可以抬着头然后手下边捏着手机,时不时低头看一 ...

  5. 一个表格说明RelativeLayout中的几个重要属性【Written By KillerLegend】

      RelativeLayout中几种布局属性的说明 无 无 无 无

  6. devexpress 数据导入(gridcontrol 导出 csv)

    // 1.gridcontrol 导出 csv: DataTable dtbNew = new DataTable(); dtbNew.Columns.Add().GetType()); dtbNew ...

  7. 在Unity项目中使用Git

    (搬运自我在SegmentFault的博客) 本文参考了Unity官网的Mastering Unity Project Folder Structure - Version Control Syste ...

  8. WPF:将HTML RGB颜色值转化为Color对象的两种方式

    (1)方式一: Color color1 = (Color)System.Windows.Media.ColorConverter.ConvertFromString("#E0E0E0&qu ...

  9. Microsoft Power BI Designer

    1/25/2015年1月25发布的预览版本,可以通过以下地址下载,注意有x64 和x32 版本区别(和上次PowerMap一样,一般也推荐的使用x64版本) http://www.microsoft. ...

  10. Oracle Rac crs无法启动

    OS:ORACLE LINUX 5.7 DB:11.2.0.3 RAC:YES 故障:1.两节点RAC,节点分别为linuxdb1.linuxdb2,其中节点linuxdb2服务器出现故障,无法启动2 ...