递归的时间复杂度求解公式: master公式
T(N) = aT(N/b) + O(N^d)
T(N)代表母问题的规模
a代表子问题次数
T(N/b)是子问题的规模
O(N^d)代表除递归操作外的时间复杂度
时间复杂度
1) logb a < d O(N ^ d)
2) logb a > d O(N ^ logb a)
3) logb a == d O(N^d logN)
归并排序:
912. 排序数组
可以采用多种排序,这里仅仅练习归并排序
思路:
1.准备两个函数
MergeSort 归并排序函数
Merge 合并函数
实质:将数组中部分进行排序 并将结果保留下来 用于下一次排序有点避免重复排序的味道了。
不重复 不遗漏
不重复是因为 某一个数 算过小和会被合并到同一个数组里
不遗漏是因为依次往外扩 和右数组合并
扩展
小和与逆序对问题
剑指 Offer 51. 数组中的逆序对
逆序对与小和是反着来的问题。
这两者之间区别就在于 一个找 右边比左边大的数 一个找左边比右边大的数
计算右侧小于当前元素的个数
327. 区间和的个数 挑战失败
快速排序:
荷兰旗题 原型单边循环法 (单区)—-三指针法(双区)—-随机数解决最差情况问题’
75. 颜色分类 三指针法
<区 和 = 区 和 >区
思路:
通过扩增 < 区 边界 与 >区边界 来将使数组分为 三区
终止条件 指针 i (用于遍历数组 碰上 >区的右边界
其实就是 < 区 推着 =区 去和 >区相汇
或者 >区 推着 =区 去 和 <区相汇
三种情况
1.nums[i] < base 归入小于区 nums[i] 与 nums[L + 1] 做交换(与<区下一个交换) 然后归入小于区左边界 扩增(L++),i扩增。
2.nums[i] > base 归入大于区 nums[i] 与 nums[R - 1] 做交换 (与>区下一个交换)然后归入大于区右边界 扩增(R—),
i原地不动(原因:此时 nums[i] 与 nums[R - 1] 已做交换,导致nums[i] 尚且未做过判断 不知该归于哪个 区。1的情况下可以i++是因为i从左至右 nums[L + 1]已被检查过。
3.nums[i] === base
i++ 直接越过 不处理
