题目

搜索区间

给定一个包含 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.正常的二分查找思想

  1.    while(left <= right){
  2. int median = (left + right)/2;
  3. if(nums[median] < target){
  4. left = median+1;
  5. }else if(nums[median]>target){
  6. right = median -1;
  7. }else if(nums[median]==target){
  8. if(nums[median-1]!=target)
  9. return median;
  10. else
  11. right = median - 1;
  12. }
  13. }

找右边界:

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

2.正常的二分查找思想

  1. while(left <= right){
  2. int median = (left + right)/2;
  3. if(nums[median] < target){
  4. left = median+1;
  5. }else if(nums[median]>target){
  6. right = median -1;
  7. }else if(nums[median]==target){
  8. if(nums[median+1]!=target)
  9. return median;
  10. else
  11. left = median + 1;
  12. }
  13. }

Java

  1. public 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 int[] searchRange(int[] A, int target) {
  8. // write your code here
  9. int[] res = {-1,-1};
  10. int len = A.length;
  11. if(len == 0 || A == null)
  12. return res;
  13. res[0] = BinaryLeft(A,0,len-1,target);
  14. res[1] = BinaryRight(A,0,len-1,target);
  15. return res;
  16. }
  17. public int BinaryLeft(int[] nums,int left,int right,int target){
  18. if(nums[0] == target)
  19. return 0;
  20. while(left <= right){
  21. int median = (left + right)/2;
  22. if(nums[median] < target){
  23. left = median+1;
  24. }else if(nums[median]>target){
  25. right = median -1;
  26. }else if(nums[median]==target){
  27. if(nums[median-1]!=target)
  28. return median;
  29. else
  30. right = median - 1;
  31. }
  32. }
  33. return -1;
  34. }
  35.  
  36. public int BinaryRight(int[] nums,int left,int right,int target){
  37. if(nums[right] == target)
  38. return right;
  39. while(left <= right){
  40. int median = (left + right)/2;
  41. if(nums[median] < target){
  42. left = median+1;
  43. }else if(nums[median]>target){
  44. right = median -1;
  45. }else if(nums[median]==target){
  46. if(nums[median+1]!=target)
  47. return median;
  48. else
  49. left = median + 1;
  50. }
  51. }
  52. return -1;
  53. }
  54.  
  55. }

Java Code

Python

  1. class Solution:
  2. """
  3. @param A : a list of integers
  4. @param target : an integer to be searched
  5. @return : a list of length 2, [index1, index2]
  6. """
  7. def searchRange(self, A, target):
  8. # write your code here
  9. res = [-1,-1]
  10. if A==None or len(A) == 0:
  11. return res
  12. res[0] = self.BoundaryLeft(A,0,len(A)-1,target)
  13. res[1] = self.BoundaryRight(A,0,len(A)-1,target)
  14. return res
  15. def BoundaryLeft(self,A,left,right,target):
  16. if A[0] == target:
  17. return 0
  18. while left<= right:
  19. median = (left + right)/2
  20. if A[median] < target:
  21. left = median + 1
  22. elif A[median] > target:
  23. right = median -1
  24. elif A[median] == target:
  25. if A[median-1]!=target:
  26. return median
  27. else:
  28. right = median -1
  29. return -1
  30.  
  31. def BoundaryRight(self,A,left,right,target):
  32. if A[right] == target:
  33. return right
  34. while left<= right:
  35. median = (left+ right)/2
  36. if A[median] < target:
  37. left = median + 1
  38. elif A[median] > target:
  39. right = median - 1
  40. elif A[median] == target:
  41. if A[median + 1]!=target:
  42. return median
  43. else:
  44. left = median + 1
  45. 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. 鼠标悬浮图片时弹出透明提示图层的jQuery特效

    源码: <!doctype html> <html class="no-js" lang="en"> <head> < ...

  2. Andriod docs加载速度慢的问题解决

    网上找了个类, import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import ja ...

  3. BI与大数据

    微博的诞生.云计算.物联网.移动互联网等各种爆炸式数据,给商业智能的蓬勃发展提供了良好的“大数据”环境.大数据为BI带来了海量数据.对挖掘来说,大数据量要更容易对比.抢夺大数据市场,需要具备一定的实力 ...

  4. tcp-client-c++

    #include "stdafx.h" #include <Winsock2.h> #include <iostream> #pragma comment( ...

  5. NOIP2015-stone(二分答案)

    这道题在考试时二分答案写炸了,结果得了20分.....同学有用贪心写的(对,贪心!!)都得了30,我感到了深深的恶意.这段时间在忙转语言,现在重新整理一下NOIP的题. 题目来源:vijos 题目如下 ...

  6. 【个人笔记】003-PHP基础-01-PHP快速入门-03-PHP环境搭建

    003-PHP基础-01-PHP快速入门 03-PHP环境搭建 1.客户端(浏览器) IE FireFox CHROME Opera Safari 2.服务器 是运行网站的基本 是放置程序代码的地方 ...

  7. NodeJS - Express 3.0下ejs模板使用 partial展现 片段视图

    如果你也在看Node.js开发指南,如果你也在一步一步实现 microBlog 项目!也许你会遇到本文提到的问题,如果你用的是Express 3.0 本书实例背景是 Express 2.0 而如今升级 ...

  8. oracle中操作数据

    使用特定格式插入日期值 insert into emp values (,', to_date('1988-11-11','yyyy-mm-dd'), ); ,); 使用子查询插入数据 create ...

  9. MySQL、SqlServer、Oracle三大主流数据库分页查询

    在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法.可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用 ...

  10. .NET核心代码保护策略-隐藏核心程序集

    经过之前那个道德指责风波过后也有一段时间没写博客了,当然不是我心怀内疚才这么久不写,纯粹是程序员的通病..怎一个懒字了得,本来想写一些长篇大论反讽一下那些道德高人的.想想还是算了,那样估计会引来新一波 ...