#1 有序数组二分查找
https://oj.leetcode.com/tag/binary-search/ (TODO)
优点:o(logn)查找
缺点:o(n)插入
二分查找计算中点避免溢出:m = (l + r) / 2 = l + (r - l) / 2
模板要点
0: start = 0 end = A.length -1
1: while (start + 1 < end)
2: mid = start + (end - start) / 2
3: A[mid] ==, <, > 不加不减 start = mid 或者 end = mid
4: while loop之外 两种情况 两个元素(start + 1 == end)或者一个元素(start == end) 不论哪种情况 都是分别处理start与end
KTH不可用此模板
http://www.lintcode.com/en/problem/binary-search/
B1:https://oj.leetcode.com/problems/search-for-a-range/ (重)
B2:https://oj.leetcode.com/problems/search-a-2d-matrix/
http://www.lintcode.com/en/problem/search-a-2d-matrix-ii/ 有序二维数组中查找
https://oj.leetcode.com/problems/search-insert-position/
J11:https://oj.leetcode.com/problems/find-peak-element/
http://lintcode.com/en/problem/first-bad-version/
https://leetcode.com/problems/sqrtx/
B3:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/ (重) (模板 但是中间跟右边比,跟左边比的无法处理没有rotate的情况)
https://oj.leetcode.com/problems/search-in-rotated-sorted-array/
办法1:先用上面longN找到最小,然后二分查找 缺点: 特殊处理1个元素与没有rotate的
方法2:分析左段, 分析右段
B4:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/
https://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/
https://oj.leetcode.com/problems/median-of-two-sorted-arrays/ (难重)
数学相关
J1:https://oj.leetcode.com/problems/divide-two-integers/ (重)(除了溢出还要小心除0)
J2:https://oj.leetcode.com/problems/sqrtx/ (比特探测好写)
#2 二叉查找树(BST)
缺点:最差情况o(n)
#3 平衡二叉查找树
2-3树:每个节点最多有三个子节点
完美2-3树:所有叶子节点在同一层
2-3树与红黑树之间有一一对应关系
Java TreeSet由RedBlackBST实现
优点:插入查找o(logn)
#4 Hash
Java HashSet由SeperateChain实现
https://oj.leetcode.com/tag/hash-table/ (TODO)
A6-1:https://oj.leetcode.com/problems/two-sum/
https://oj.leetcode.com/problems/two-sum-iii-data-structure-design/
#5 找第K元素
无序数组中找第K大的数 (重)
https://oj.leetcode.com/problems/median-of-two-sorted-arrays/