
快排
思想:分治的核心就是找到一个问题,这个问题的子问题和这个问题本身要用一样的解法,但是问题的规模不一样。 快排的核心就是将数组分成左右子数组,怎么分呢? 找出一个pivot(一般是这一次排序的首元素)将以下逻辑写成一个方法partition,将小于等于pivot的数都放到左边,将大于等于pivot的数都放到右边,然后将pivot放到中间。 接着对左手数组重复这个过程,整体就有序了。 提问为什么会有序呢? 因为在一次排列的过程中pivot找到了自己的位置,经过有限次的再分,一定会让快排处理的对象只有一个元素,那这一个元素本身就是有序的,返回。那么整体就是有序的了。
代码:

时间复杂度分析:
最好,平均,o(nlogn)排序树 层数(logn)
最坏o(n^2) 因为最坏的树高是(n)
选第二大(选第k大)
参考快排的思想 mid就是当前找到的下标,如果当前下标不是就在左区间搜索(返回左区间的搜索值)反之搜索有区间。 第k大就是搜索的下标不同。

汉诺塔
思想:假设有A,B,C三个柱,src(起始柱),aux(辅助柱),dst(目标柱)。
如果有一个盘子,只需要从src移动到dst。 如果有2个那就将上面的一个放到aux,最后一个放到dst,接将aux的放到dst。
结合两个盘子的思想,我们只需要将A柱的前n-1盘子当做一个一个盘子。 那么整体就只有两个盘子。那么我们整体的逻辑就是:
如果只有1个盘子直接执行从src移动到dst
1.将n-1个盘子从src移动到aux,辅助柱是dst
2.将src最后的一个移动到dst
3.将n-1个盘子从aux移动到dst,通过src


背包问题
dp[i][j] 的值为:从0-i号物品任选,背包容量为j的情况下可获得的最大价值。


最长公共子序列(字符从1开始)


前几个,下标不就是i-1,j-1

最大子段和
dp[0] = nums[0] 然后从1开始遍历

