题目

搜索区间

给定一个包含 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. 8款实用的Jquery瀑布流插件

    1.网友Null分享Jquery响应式瀑布流布局插件 首先非常感谢网友Null的无私分享,此作品是一款响应式瀑布流布局Jquery插件,网友Null增加了一个屏幕自适应和响应式,响应式就是支持智能手机 ...

  2. linux查看硬件信息

    1,查看CPU信息:cat /proc/cpuinfo2,查看板卡信息:cat /proc/pci3,查看USB设备:cat /proc/bus/usb/devices4,查看PCI信息:lspci ...

  3. AngularJS(11)-API

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 防火墙设置:虚拟机ping不通主机,但是主机可以ping通虚拟机(转载)

    我在Windows7系统安装了虚拟机,通过虚拟机安装了Ubuntu13.04,我设置的主机与虚拟机的连接方式是桥接,安装好后,发现虚拟机ping不通主机,但是主机可以ping通虚拟机. 我的操作是:关 ...

  5. SpringUtil

    /** SpringUtil.java {{IS_NOTE Purpose: Description: History: Thu Jun 1 13:53:53 2006, Created by hen ...

  6. (一)使用log4net生成日志文件

    1.引入log4net.dll 1.1 Nuget安装 或 http://logging.apache.org/log4net/下载log4net的源代码,编译后把log4net.dll引入项目. 2 ...

  7. poj 3237 Tree 树链剖分+线段树

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  8. java_Thread生产者与消费者 Demo

    package com.bjsxt.Thread.Demo; public class ProducerConsumer { /** * 生产者与消费者 * @param args */ public ...

  9. IIS WMI Provider

    section contains information about the classes that are implemented by the IIS WMI provider in the M ...

  10. iOS的动画效果类型及实现方法

    实现iOS漂亮的动画效果主要有两种方法, 一种是UIView层面的, 一种是使用CATransition进行更低层次的控制, 第一种是UIView,UIView方式可能在低层也是使用CATransit ...