Search for a Range

1.最简单的想法,用最普通的二分查找,找到target,然后向左右扩张,大量的重复的target,就会出现O(n)效率。

  1. class Solution {
  2. public int[] searchRange(int[] A, int target) {
  3. int ans[]=new int[];
  4. int a= bserch(A,target);
  5. if(a==-) {ans[]=-;ans[]=-; return ans;}
  6. //left
  7. int b=a-;
  8. while(b>=&&A[b]==target) b--;
  9. ans[]=b+;
  10. b=a+;
  11.  
  12. while(b<=A.length-&&A[b]==target) b++;
  13. ans[]=b-;
  14. return ans;
  15.  
  16. }
  17.  
  18. public int bserch(int A[],int target)
  19. {
  20. int low=;
  21. int end=A.length-;
  22. while(low<=end)
  23. {
  24. int mid=(low+end)>>;
  25. if(A[mid]==target) return mid;
  26. else if(A[mid]<target) low=mid+;
  27. else end=mid-;
  28.  
  29. }
  30.  
  31. return -;
  32. }
  33.  
  34. }

2.二分查找加入第一个大的位置(上届),第一个大于等于它的位置(下界)

  1. class Solution {
  2. public int[] searchRange(int[] A, int target) {
  3. int ans[]=new int[2];
  4. int a= bserch(A,target);
  5. if(a==-1) {ans[0]=-1;ans[1]=-1; return ans;}
  6. //left
  7. int b=a-1;
  8. while(b>=0&&A[b]==target) b--;
  9. ans[0]=b+1;
  10. b=a+1;
  11.  
  12. while(b<=A.length-1&&A[b]==target) b++;
  13. ans[1]=b-1;
  14. return ans;
  15.  
  16. }
  17. //其实难点就是A[mid]==target,如何调整low和high
  18. public int bserch(int A[],int target)
  19. {
  20. int low=0;
  21. int end=A.length-1;
  22. while(low<=end)
  23. {
  24. int mid=(low+end)>>1;
  25. if(A[mid]==target) return mid;
  26. else if(A[mid]<target) low=mid+1;
  27. else end=mid-1;
  28.  
  29. }
  30.  
  31. return -1;
  32. }
    //第一个大于target的
  33. public int upperbound(int A[],int target) // the first one larger than target
  34. {
  35. int low=0;
  36. int end=A.length-1;
  37. while(low<=end)
  38. {
  39. int mid=(low+end)>>1;
  40. if(A[mid]>target) end=mid-1;
  41. else low=mid+1;
  42.  
  43. }
  44. return low;
  45. }
  46. public int lowbound(int A[],int target) // the first one larger or equal target
  47. {
  48. int low=0;
  49. int end=A.length-1;
  50. while(low<=end)
  51. {
  52. int mid=(low+end)>>1;
  53. if(A[mid]>=target) end=mid-1;
  54. else low=mid+1;
  55.  
  56. }
  57. return low;
  58. }
  59.  
  60. }

[leetcode]二分查找总结的更多相关文章

  1. leetcode二分查找问题整理

    自从做完leetcode上的三道关于二分查找的题后,我觉得它是比链表找环还恶心的题,首先能写出bugfree代码的人就不多,而且可以有各种变形,适合面试的时候不断挑战面试者,一个程序猿写代码解决问题的 ...

  2. leetcode 二分查找

    https://oj.leetcode.com/problems/search-for-a-range/就是一个二分查找,没事练练手 public class Solution { public in ...

  3. leetcode 二分查找 Search in Rotated Sorted ArrayII

    Search in Rotated Sorted Array II Total Accepted: 18500 Total Submissions: 59945My Submissions Follo ...

  4. Leetcode 二分查找 Search Insert Position

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Search Insert Position Total Accepted: 14279 T ...

  5. leetcode 二分查找 Search in Rotated Sorted Array

    Search in Rotated Sorted Array Total Accepted: 28132 Total Submissions: 98526My Submissions Suppose ...

  6. LeetCode 二分查找模板 II

    模板 #2: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...

  7. LeetCode 二分查找模板 I

    模板 #1: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...

  8. LeetCode 二分查找模板 III

    模板 #3: int binarySearch(vector<int>& nums, int target){ if (nums.size() == 0) return -1; i ...

  9. leetcode二分查找相关

    目录 33/81搜索旋转排序数组 34在排序数组中查找元素的第一个和最后一个位置 35搜索插入位置 74搜索二维矩阵 300最长上升子序列,354俄罗斯套娃信封问题 33/81搜索旋转排序数组 假设按 ...

随机推荐

  1. HBuilder手机Iphone运行提示“未受信用的企业级开发者”

    HBuilder手机Iphone运行提示“未受信用的企业级开发者” 解决方法:设置-----通用------设备管理-----点击Digtial Heaven....---信任"Digtia ...

  2. sass中常用mixin

    //设置字体大小 @mixin font($s:14px,$h:1.5,$f:microsoft yahei){ font:$s/#{$h} $f; } //参数(方向,大小,颜色),默认:向下,10 ...

  3. javascript 节点的增,删,改,查

    1.创建节点  A.创建元素节点    document.createElement("元素标签名");   B.创建属性节点    document.createAttribut ...

  4. session 保存在指定的数据表,cookie设置

    首先建立数据表,可在ThinkPHP/Extend/Driver/Session/SessionDb.class.php中copy代码 在配置文件中配置: 'SESSION_TYPE' => ' ...

  5. jsonp跨域访问详解

    jsonp是"用来跨域的" 同源策略 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 1.随便建两个网 ...

  6. mongodb数据库操作--备份 还原 导出 导入

    首先数据库备份: mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径  mongodump -h 127.0.0.1 -u admin -p ...

  7. uboot顶层config.mk分析

    uboot顶层目录中的config.mk定义了确定了当前执行makefile所对应的源文件目录.目标文件目录,编译的程序编译.连接的选项,以及目标文件生成的规则等等.它被包含在顶层的makefile以 ...

  8. TCP/IP入门学习(2)---OSI分层

    一.会话层以上的处理 1.表示层 将数据从主机特有的格式转换为网络标准传输格式.以此使得不同环境之间的通信成为可能. 2.会话层 即决定使用哪个连接或者哪种连接方式将数据发送出去.会话层也会在数首部添 ...

  9. 如何使用Github仓库创建网站

    官方文档:https://help.github.com/categories/github-pages-basics/ 1.创建一个仓库 2.额外建立一个gh-pages分支 3.添加CNAME文件 ...

  10. complex(x):创建一个复数

    使用python可以实现将一个整数或者浮点数转换为一个复数: 演示如下: >>> # 演示复数函数:complex(x) ... >>> x = complex(1 ...