Binary Search

T(n) = T(n/2) + O(1)   =>    T(n) = O(lg n)

proof:

如果能用iterable , 就用while loop, 可以防止用recursion的时候stack overflow( process in Linux is 8Mb), stack room is static for each process. (堆空间, heap room 是内存, 是动态的。)层数越多,存储更多中间/临时变量,最终超过系统配的stack空间,就会出现stack overflow。

建议:

  - 如果问题不复杂,能用iterable就用iterable

    - 如果问题比较复杂,还是用recursive吧

1) ask 是否有duplicates?

  1.1  如果没有duplicates

  标准的binary search:

  a) l + 1 < r   相当于如果l, r 相邻就跳出,这样能够避免死循环. 但是while loop之后需要加一个判断, 也就是d选项

  b) l + (r - l)//2      # 不用(l+r)//2 , 因为l + r 有可能overflow,强行装*,当l + r 之和超过int的最大值,2的32次方减1,会溢出。

  c) A[mid] ==, <, >    # 为了bug free, 建议举个小栗子, 然后画图去判断.

  d) A[l], A[r] ? target

  Code

  

def BinarySearch(self, nums, target):  # nums is sorted
if not nums or target < nums[0] or target > nums[-1]: return -1
l, r = 0, len(nums) -1 # note here is len(nums) -1
while l + 1 < r:
mid = l + (r - l)//2
if nums[mid] > target:
r = mid
elif nums[mid] < target:
l = mid
else:
return mid
if nums[l] == target:
return l
if nums[r] == target:
return r
return -1

  1.2 如果有duplicates

  a) ask 是first index, last index or dont matter?

    如果是first index:

      if A[mid] == target: r = mid

      最后判断 A[l] 和A[r] 的时候先判断 A[l]

    如果是last index:  

      if A[mid] == target: l = mid

      最后判断 A[l] 和A[r] 的时候先判断 A[r]

Questions:

[LeetCode] 704. Binary Search_Easy tag: Binary Search

[LeetCode] 374. Guess Number Higher or Lower_Easy tag: Binary Search   

[LeetCode] 34. Find First and Last Position of Element in Sorted Array == [LintCode] 61. Search for a Range_Easy tag: Binary Search   first index and last index  == target in duplicates.

[LeetCode] 35. Search Insert Position_Easy tag: Binary Search     first index >= target, without duplicates

[LeetCode] 278. First Bad Version_Easy tag: Binary Search      first index, without duplicates

[LeetCode] 162. Find Peak Element(852. Peak Index in a Mountain Array)_Medium tag: Binary Search

[LeetCode] 74. Search a 2D Matrix_Medium tag: Binary Search

[LeetCode] 240. Search a 2D Matrix II_Medium tag: Binary Search

[LeetCode] 69. Sqrt(x)_Easy tag: Binary Search

[LeetCode] 153. Find Minimum in Rotated Sorted Array_Medium tag: Binary Search   first index <= nums[-1]

[LeetCode] 154. Find Minimum in Rotated Sorted Array II_Hard tag: not real binary search anymore

 

[LeetCode] 33. Search in Rotated Sorted Array_Medium tag: Binary Search

[LeetCode] 81. Search in Rotated Sorted Array II_Medium tag: not real binary search anymore

[LeetCode] 702. Search in a Sorted Array of Unknown Size_Medium tag: Binary Search

[LeetCode] 4. Median of Two Sorted Arrays_Hard tag: Array, Binary Search

[LeetCode] questions conclusion_ Binary Search的更多相关文章

  1. [LeetCode] 95. Unique Binary Search Trees II 唯一二叉搜索树 II

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  2. [LeetCode] 96. Unique Binary Search Trees 唯一二叉搜索树

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  3. [LeetCode] 272. Closest Binary Search Tree Value II 最近的二叉搜索树的值 II

    Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...

  4. [leetcode]95. Unique Binary Search Trees II给定节点形成不同BST的集合

    Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...

  5. [LeetCode] 95. Unique Binary Search Trees II(给定一个数字n,返回所有二叉搜索树) ☆☆☆

    Unique Binary Search Trees II leetcode java [LeetCode]Unique Binary Search Trees II 异构二叉查找树II Unique ...

  6. Java for LeetCode 095 Unique Binary Search Trees II

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  7. [LeetCode] 98. Validate Binary Search Tree_Medium

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  8. [LeetCode] 270. Closest Binary Search Tree Value 最近的二叉搜索树的值

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  9. [LeetCode] Trim a Binary Search Tree 修剪一棵二叉搜索树

    Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that a ...

随机推荐

  1. 写写我的硕士三年【zz】

    昨天我们组的10bit-40M ADC测出来了,自己终于能松口气,可以无牵无挂的毕业了.晚上老板bg全组毕业生,喝了很多,我对老板说:"这3年在组里,我是把它当作事业来做的!"是的 ...

  2. Thrift版本管理

    对于健壮的服务,其中的数据类型必须一种机制来对其进行版本管理,尤其是它可以在不中断服务(或者更坏的情况,出现段错误)的前提下,增加或删除一个对象中的字段,或者改变一个函数的参数列表. 字段标识符 Th ...

  3. Ubuntu 安装 .bundle 文件

    ubuntu安装VMware-Workstation-Full-15.0.2-10952284.x86_64.bundle 一.*.bundle 文件比较特殊,只有在给它了执行权限后才能执行安装操作. ...

  4. [No000015B]三十分钟说清经济机器是怎样运行的

    https://v.qq.com/x/page/z01685nf12f.html

  5. Chap5:操作文件和目录[The Linux Command Line]

    Wildcards Wildcard Meaning * Matches any characters ? Matches any single character [characters] Matc ...

  6. [daily][archlinux][game] 几个linux下还不错的游戏

    春节在家放松, 装了几个游戏在archlinux上,玩起来还不错. 假期结束开工了, 玩的时间也会比较少,准备删掉, 记录如下: 1. 0ad 即时战略类, 类似于冷兵器时代的红警. 画面还不错, 可 ...

  7. Servlet基本介绍和使用

    基本概念 Servlet又称为Java Servlet是一个基于java技术的web组件,运行在服务器端,用于生成动态的内容.Servlet是平台独立的java类,编写一个Servlet实际上就是按照 ...

  8. AT命令text模式发送中文

    AT命令text模式发送中文 AT+CSCS=? 查询支持哪些编码 设置编码和编码格式等 AT+CMGF=1 //TEXT 模式 //AT+CSCS="UCS2" //设置编码 A ...

  9. Java+Selenium 如何处理Try/Catch

    场景:为了检查数据是否存在,如果存在就把数据删除,不存在则新增保存.因为我们需要做下数据初始化准备工作. 一.:Feature 示例: Scenario: E-251:维护薪资帐套明细 When I ...

  10. 洛谷P3158 放棋子 [CQOI2011] dp+数论

    正解:dp+数论 解题报告: 传送门! 考虑对每种颜色的棋子单独考虑鸭,那显然有,当某一行或某一列已经被占据的时候,那一行/一列就不能再放别的颜色的棋子了,相当于直接把那一行/一列直接消了 显然就能考 ...