题目

搜索区间

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

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

样例

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

返回[3, 4]

挑战

时间复杂度 O(log n)

解题

正常解法是二分法分别找左右边界的,时间复杂度O(logN),但是要注意边界,边界很多种情况的。

找左边界:

1.起始位置是0的单独考虑:nums[0] == target  return 0

2.正常的二分查找思想

       while(left <= right){
int median = (left + right)/2;
if(nums[median] < target){
left = median+1;
}else if(nums[median]>target){
right = median -1;
}else if(nums[median]==target){
if(nums[median-1]!=target)
return median;
else
right = median - 1;
}
}

找右边界:

1.结束位置单独考虑:nums[right] == target  return right

2.正常的二分查找思想

while(left <= right){
int median = (left + right)/2;
if(nums[median] < target){
left = median+1;
}else if(nums[median]>target){
right = median -1;
}else if(nums[median]==target){
if(nums[median+1]!=target)
return median;
else
left = median + 1;
}
}

Java

public class Solution {
/**
*@param A : an integer sorted array
*@param target : an integer to be inserted
*return : a list of length 2, [index1, index2]
*/
public int[] searchRange(int[] A, int target) {
// write your code here
int[] res = {-1,-1};
int len = A.length;
if(len == 0 || A == null)
return res;
res[0] = BinaryLeft(A,0,len-1,target);
res[1] = BinaryRight(A,0,len-1,target);
return res;
}
public int BinaryLeft(int[] nums,int left,int right,int target){
if(nums[0] == target)
return 0;
while(left <= right){
int median = (left + right)/2;
if(nums[median] < target){
left = median+1;
}else if(nums[median]>target){
right = median -1;
}else if(nums[median]==target){
if(nums[median-1]!=target)
return median;
else
right = median - 1;
}
}
return -1;
} public int BinaryRight(int[] nums,int left,int right,int target){
if(nums[right] == target)
return right;
while(left <= right){
int median = (left + right)/2;
if(nums[median] < target){
left = median+1;
}else if(nums[median]>target){
right = median -1;
}else if(nums[median]==target){
if(nums[median+1]!=target)
return median;
else
left = median + 1;
}
}
return -1;
} }

Java Code

Python

class Solution:
"""
@param A : a list of integers
@param target : an integer to be searched
@return : a list of length 2, [index1, index2]
"""
def searchRange(self, A, target):
# write your code here
res = [-1,-1]
if A==None or len(A) == 0:
return res
res[0] = self.BoundaryLeft(A,0,len(A)-1,target)
res[1] = self.BoundaryRight(A,0,len(A)-1,target)
return res
def BoundaryLeft(self,A,left,right,target):
if A[0] == target:
return 0
while left<= right:
median = (left + right)/2
if A[median] < target:
left = median + 1
elif A[median] > target:
right = median -1
elif A[median] == target:
if A[median-1]!=target:
return median
else:
right = median -1
return -1 def BoundaryRight(self,A,left,right,target):
if A[right] == target:
return right
while left<= right:
median = (left+ right)/2
if A[median] < target:
left = median + 1
elif A[median] > target:
right = median - 1
elif A[median] == target:
if A[median + 1]!=target:
return median
else:
left = median + 1
return -1

Python Code

lintcode: search for a range 搜索区间的更多相关文章

  1. [LeetCode] 34. Search for a Range 搜索一个范围(Find First and Last Position of Element in Sorted Array)

    原题目:Search for a Range, 现在题目改为: 34. Find First and Last Position of Element in Sorted Array Given an ...

  2. [LeetCode] Search for a Range 搜索一个范围

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

  3. LintCode Search For a Range (Binary Search)

    Binary Search模板: mid 和 target 指针比较,left/ right 和 target 比较. 循环终止条件: 最后剩两数比较(while(left + 1 < righ ...

  4. LeetCode OJ:Search for a Range(区间查找)

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

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

    题目 二叉查找树中搜索区间 给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点.找到树中所有值在 k1 到 k2 范围内的节点.即打印所有x (k1 <= x <= ...

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

    二叉查找树中搜索区间 给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点.找到树中所有值在 k1 到 k2 范围内的节点.即打印所有x (k1 <= x <= k2 ...

  7. [OJ] Search for a Range

    LintCode 61. Search for a Range (Medium) LeetCode 34. Search for a Range (Medium) class Solution { p ...

  8. LeetCode解题报告—— Search in Rotated Sorted Array & Search for a Range & Valid Sudoku

    1. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated(轮流,循环) at so ...

  9. Add Digits, Maximum Depth of BinaryTree, Search for a Range, Single Number,Find the Difference

    最近做的题记录下. 258. Add Digits Given a non-negative integer num, repeatedly add all its digits until the ...

随机推荐

  1. silverlight 文本框只能输入数字

    void mobile_KeyUp(object sender, KeyEventArgs e) { Regex rg = new Regex("^[0-9]{1,11}$"); ...

  2. Unity学习笔记(4):依赖注入

    Unity具体实现依赖注入包含构造函数注入.属性注入.方法注入,所谓注入相当赋值,下面一个一个来介绍 1:构造函数注入 1.1当类有多个构造函数时,可以通过InjectionConstructor特性 ...

  3. mongodb学习之路1

    第一节 MongoDB介绍及下载与安装 引言 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似 json的b ...

  4. 你必须知道的.NET

    作者博客地址:http://www.cnblogs.com/anytao/archive/2008/04/09/anytao_insidenet_center.html 第1章 OO大智慧 1.1对象 ...

  5. WPF自定义控件(三)——Window

    一样!先来看看效果吧: 怎么样?效果很好吧,而且不只是样式哟!所有系统窗体有的交互操作都可以实现! 但可惜...有很多和系统API有关的东西本人了解得并不多,所以这个窗体是基于他人的成果上产生的.关于 ...

  6. 【转】Microsoft® SQL Server® 2012 Performance Dashboard Reports

    http://www.cnblogs.com/shanyou/archive/2013/02/12/2910232.html SQL Server Performance Dashboard Repo ...

  7. 自己实现的库函数1(strlen,strcpy,strcmp,strcat)

    为了便于理解和使用库函数,先把自己实现的几个函数以及测试函数呈现如下. //求字符串长度的函数int my_strlen(const char* pStr){ assert(pStr != NULL) ...

  8. 命令行参数的处理函数getopt

    命令参数 在linux下, shell命令的参数分两种情况: a.参数需要附加信息, 如"wget http://www.abc.com/1.zip -o 1.zip" b.参数不 ...

  9. linux 标准io笔记

    三种缓冲 1.全缓冲:在缓冲区写满时输出到指定的输出端. 比如对磁盘上的文件进行读写通常是全缓冲的. 2.行缓冲:在遇到'\n'时输出到指定的输出端. 比如标准输入和标准输出就是行缓冲, 回车后就会进 ...

  10. C语言的sizeof

    今天帮同学想用C实现数组的折半查找,本来算法挺简单的,可是折腾了好几个小时才发现问题在哪,这个sizeof坑人不浅啊. #include<stdio.h> void m(int []); ...