题目

搜索区间

给定一个包含 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. AJAX 跨域 :Access-Control-Allow-Origin

    在一个项目上想用NodeJS,在前端的JS(http://localhost/xxx)中ajax访问后端RestAPI(http://localhost:3000/….)时(Chrome)报错: XM ...

  2. apache泛域名的配置

    假设我们把服务器架设在:/home/www文件夹下面 我们有应用A和B,对应的文件目录为A:/home/www/testAB:/home/www/testB 设置proxy_module让网站支持泛域 ...

  3. linux下查看进程内存使用情况

    1. top命令--动态查看一个进程的内存使用top -d 1 -p pid [,pid ...]  //设置为delay 1s,默认是delay 3s  如果想根据内存使用量进行排序,可以shift ...

  4. Python 的列表解析和生成表达式的异同

      Python中的列表解析和生成表达式是非常好的特性,他们的形式相似,但是应用场景不太一样. 相似点 列表解析和生成表达式最大的相似点是使用形式: [expr for iter_var in ite ...

  5. Hive内表和外表的区别

    本文以例子的形式介绍一下Hive内表和外表的区别.例子共有4个:不带分区的内表.带分区的内表.不带分区的外表.带分区的外表. 1 不带分区的内表 #创建表 create table innerTabl ...

  6. Java String.split()注意点

    //String[] aa = "aaa|bbb|ccc".split("|");//错误 String[] aa = "aaa|bbb|ccc&qu ...

  7. OPatch failed with error code 73

    前几天给一套LINUX下的RAC数据库打补丁升级,有一台机器更新失败了,相关的异常内容如下: Restoring "/u01/app/oracle/11.2.0/db_1" to ...

  8. 流水线(pipe-line)简介

    1.什么是流水线设计技术? 答:所谓流水线设计实际上是把规模较大.层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组并暂存数据. K级就是有K个寄存器组,从上到下没有反馈电路. 2.流水线设计的深 ...

  9. 网络笔记01-2 scoket

    scoket: 1.socket /** 第一个参数(domain): 表示用什么协议 AF_INET 为IPV4开发 第二个参数(type): 表示scoket为什么类型SOCK_STREAM为TC ...

  10. NodeJS学习笔记(转载)

    前言 让nodeJS跑起来 文件结构 node_modules/ejs app.js 路由 路由规则 添加路由规则 注册功能 MongoDB 安装MongoDB 链接MongoDB 结语 前言 最近同 ...