搜索区间

搜索区间

给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。

如果目标值不在数组中,则返回[-1, -1]

样例

给出[5, 7, 7, 8, 8, 10]和目标值target=8,

返回[3, 4]

挑战

时间复杂度 O(log n)

标签

数组 排序数组 二分法

 1 class Solution {
 2     /**
 3      *@param A : an integer sorted array
 4      *@param target :  an integer to be inserted
 5      *return : a list of length 2, [index1, index2]
 6      */
 7 public:
 8     vector<int> searchRange(vector<int> &A, int target) {
 9         // write your code here
10         vector<int> result;
11         int size = A.size()-1;
12         if(A.empty()) {
13             result.push_back(-1);
14             result.push_back(-1);
15         }
16         else {
17             result.push_back(getFirstTarget(A, target, 0, size));
18             result.push_back(getLastTarget(A, target, 0, size));
19         }
20         return result;
21     }
22
23     int getFirstTarget(vector<int> &A, int target, int low, int high) {
24         if(low > high)
25             return -1;
26         int mid = (low+high)/2;
27         if(A[mid] == target) {
28             if((mid>0 && A[mid-1]!=target) || mid==0)
29                 return mid;
30             else
31                 high = mid-1;
32         }
33         else if(A[mid] > target)
34             high = mid-1;
35         else
36             low = mid+1;
37
38         return getFirstTarget(A, target, low, high);
39     }
40
41     int getLastTarget(vector<int> &A, int target, int low, int high) {
42         int size = A.size()-1;
43         if(low > high)
44             return -1;
45         int mid = (low+high)/2;
46         if(A[mid] == target)  {
47             if((mid<size && A[mid+1]!=target) || mid==size)
48                 return mid;
49             else
50                 low = mid+1;
51         }
52         else if(A[mid] > target)
53             high = mid-1;
54         else
55             low = mid+1;
56
57         return getLastTarget(A, target, low, high);
58     }
59 };
时间: 2024-08-26 14:04:27

搜索区间的相关文章

hdu 4597 Play Game (记忆化搜索 区间dp)

#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; int dp[30][30][30][30]; int vis[30][30][30][30]; int a[2][30],sum[2][30]; int dfs(int i,int j,int k,int l) { if(vi

LintCode 11 二叉查找树的搜索区间

题目链接:http://www.lintcode.com/zh-cn/problem/search-range-in-binary-search-tree/ 1.描述 给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点.找到树中所有值在 k1 到 k2 范围内的节点.即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值.返回所有升序的节点值. 2.样例 3.思路分析 要充分利用二叉查找树的特性:左小右大和中序遍历就是一个有序序列. 借助一个栈

lintcode 11. 二叉查找树中搜索区间

class Solution { public: vector<int> res; int k11,k22; static bool comp(const int &a,const int &b) { return a<b; } /* * @param root: param root: The root of the binary search tree * @param k1: An integer * @param k2: An integer * @return:

区间包含

区间包含 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 夫妻没有隔夜仇. 题目 区间包含:给定一个源区间[x,y]和N个无序的目标区间[x1,y1][x2,y2][x3

区间包括

区间包括 个人信息:就读于燕大本科软件project专业 眼下大三; 本人博客:google搜索"cqs_2012"就可以; 个人爱好:酷爱数据结构和算法.希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 夫妻没有隔夜仇. 题目 区间包括:给定一个源区间[x,y]和N个无序的目标区间[x1,y1][x2,

算法dfs——二叉搜索树中最接近的值 II

901. 二叉搜索树中最接近的值 II 中文 English 给定一棵非空二叉搜索树以及一个target值,找到 BST 中最接近给定值的 k 个数. 样例 样例 1: 输入: {1} 0.000000 1 输出: [1] 解释: 二叉树 {1},表示如下的树结构: 1 样例 2: 输入: {3,1,4,#,2} 0.275000 2 输出: [1,2] 解释: 二叉树 {3,1,4,#,2},表示如下的树结构: 3 / 1 4 2 挑战 假设是一棵平衡二叉搜索树,你可以用时间复杂度低于O(n)

LeetCode——搜索插入位置

联系二分查找 Q:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置.你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输出: 2 示例?2: 输入: [1,3,5,6], 2 输出: 1 示例 3: 输入: [1,3,5,6], 7 输出: 4 示例 4: 输入: [1,3,5,6], 0 输出: 0 A: 复习二分查找. 但实际上有更方便的做法. 寻找左侧边界的?分查找: 因为我们初始化 right

专题总结—二分查找与旋转排序数组

1.二分搜索的模板. 算法面试中,如果需要优化O(n)的时间复杂度,那么只能是O(logn)的二分法. 注意二分法大多数情况都是适用于排序数组. http://www.lintcode.com/zh-cn/problem/first-position-of-target/ class Solution { public: /** * @param nums: The integer array. * @param target: Target number to find. * @return:

数学软件 之 基于MATLAB的DFP算法

DFP算法是本科数学系中最优化方法的知识,也是无约束最优化方法中非常重要的两个拟Newton算法之一,上一周写了一周的数学软件课程论文,姑且将DFP算法的实现细节贴出来分享给学弟学妹参考吧,由于博客不支持数学公式,所以就不累述算法原理及推倒公式了. DFP算法流程图 先给出DFP算法迭代流程图,总体上是拟Newton方法的通用迭代步骤,唯独在校正公式的地方有所区别. MATLAB实现DFP 基于此图便可以设计DFP算法的MATLAB程序: 对分法及加步探索法的实现 首先由于DFP算法中需要利用一