题目

搜索区间

给定一个包含 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. 模拟抛硬币(C语言实现)

    实现代码: #include<stdio.h> #include<stdlib.h> int heads() { ; } int main(int argc, char *ar ...

  2. MongoDB与php的配合使用 【windows版】

    通过学习了如何使用和部署MongoDB,尝试了一下如何将mongodb应用到php的程式中去. 1.预备工作 首先得准备好mongodb,并按照相关方法部署以及服务能正常运行中. 对于初学者,可以参考 ...

  3. 强大的网络通信框架(不实现缓存)--第三方开源--AsyncHttpClient

    AsyncHttpClient是一款比较流行的Android异步网路加载库,在github上的网址是:https://github.com/loopj/android-async-http但是Asyn ...

  4. SqlServer ,storedprocedure操作

    USE [Role] GO /*Create a table*/ IF OBJECT_ID ('dbo.Users', 'U') IS NOT NULL DROP TABLE Users GO CRE ...

  5. mysql中log

    mysql的主从模式配置 1.改主库配置文件:D:\Program Files\MySQL\MySQL Server 5.5(my.ini/my.cnf)在下面加入 [mysqld] log=c:/a ...

  6. PAT乙级真题1008. 数组元素循环右移问题 (20)

    原题: 1008. 数组元素循环右移问题 (20) 时间限制400 ms内存限制65536 kB 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M&g ...

  7. 菜鸟学习Struts——简易计算器

    这是学习Struts的一个简单的例子文件结构如下: 1.配置Struts环境 2.新建input.jsp,success.jsp,error.jsp input.jsp代码如下: <%@ pag ...

  8. Reactor模式

    对象行为类的设计模式,对同步事件分拣和派发.别名Dispatcher(分发器) Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I ...

  9. c语言编程之二叉树

    利用链表建立二叉树,完成前序遍历.中序遍历.后序遍历. 建立二叉树用的是前序遍历建立二叉树: #include<stdio.h> #include<stdlib.h> #inc ...

  10. 《C++Primer》复习——with C++11 [2]

    1.数组引用形参,C++允许将变量定义成数组的引用,给予同样的道理,形参也可以是数组的引用,此时引用形参绑定到对应的实参上,也就是绑定到数组上 ]) { for (auto elem : arr) c ...