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. Solve Error : Undefined function or variable ‘setInitialWorkingFolder’. Error in matlabrc (line 197)

    When compile program using Visual Studio 2015, Matlab 2016b, and OpenCV 3.1.0, one might get the err ...

  2. 11:HTML5 发展史

    11:HTML5 发展史 HTML5草案的前身名为 Web Applications 1.0,于2004年被WHATWG提出,于2007年被W3C接纳,并成立了新的 HTML 工作团队. HTML 5 ...

  3. STL学习笔记--排序算法

    排序算法 C++ STL 的排序算法(Sorting algorithms)是一组将无序序列排列成有序序列的模板函数或与排序相关的模板函数,提供了排序.折半搜索.归并.集合操作.堆操作.最值求解.字典 ...

  4. easyui---layout实战

    第一步: <div id="cc" class="easyui-layout" fit=true> <div region="nor ...

  5. ARM v8中断机制和中断处理(转)

    https://blog.csdn.net/firefox_1980/article/details/40113637 https://blog.csdn.net/firefox_1980/artic ...

  6. linux:nano 、cat和file

    nano 在 Linux 下面编辑文件通常我们会直接使用专门的命令行编辑器比如(emacs,vim,nano),涉及 Linux 上的编辑器的内容比较多,且非常重要. nano 是 linux 的一款 ...

  7. bilibili的直播第三方IJKMediaFramework.framework下载打包使用教程

    参考和引用的地址: http://www.code4app.com/thread-8941-1-1.html http://blog.csdn.net/cccallen/article/details ...

  8. 关于数据库DML、DDL、DCL区别

    总体解释:DML(data manipulation language):       它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据 ...

  9. [gdb][python][libpython] 使用gdb调试python脚本

    https://devguide.python.org/gdb/ https://sourceware.org/gdb/current/onlinedocs/gdb/Python.html#Pytho ...

  10. Flash片头loading与MovieClipLoader

    //创建侦听器,侦听是否加载完成 var loader = new MovieClipLoader(); loader.onLoadComplete = function(obj) { if(obj ...