提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一、分治
1.poj 3714
- 分别找到两个数组的中位数,两者进行比较,每次就能剔除一半的数字
- 长度不一样时,
如果两个数组数字个数之和为奇数则为最中间的数,即找到第(len(nums1) + len(nums2) + 1) // 2小数的问题
如果为偶数则为中间两个数的平均数,即找到第(len(nums1) + len(nums2) + 1) // 2小数和第(len(nums1) + len(nums2) + 2) // 2小数的问题
在两个数组中找到第k小数的方法为:
先对K二分,令t = min(K // 2, len(nums2))
比较nums1[t - 1]和nums2[t - 1],删除较小值所在部分下标t之前的t个元素,继续递归寻找第k - t小数
最终结果为(第(len(nums1) + len(nums2) + 1) // 2小数 + 第(len(nums1) + len(nums2) + 2) // 2小数) / 2
2.
求这些矩形的轮廓线
- 将这些矩形一分为2,先求左边矩阵的轮廓线,再求右边矩形的轮廓线,再合并
- 合并方法:从左到右扫描,h为0为起点,下一次h为0为末端。每次取max(h1, h2)。并不需要对整个坐标轴进行枚举,只需要对离散的坐标点的位置进行枚举。
3.最大子数组问题
看到nlogn就可以想到要分治
- 三种情况,最大子数组在左、在右和左右两部分都含有
- 左边求最大值A,右边求最大值B,中间两边都有的最大值就是两边的最大值相加,即C = A + B
A不是指左边区间的最大子序和,因为这可能和右边的最大子序和的区间不是连续的
A是从mid为区间起点开始向左遍历找到那个使得区间内数最大的区间中点,B同理 - 返回结果为max{leftmax, rightmax, C}
master定理 https://zhuanlan.zhihu.com/p/113406812
4.
扫描一遍,因为数组是有序的,看左边比右边大的那个位置移动了多少
一分为二来扫描,通过mid与l和r比较来继续划分
5.
二分
-
左右两边分别找有没有两个数之和为x的两个数。这个步骤采用归并排序,在排序的merge过程中先判断左右两个数组是否存在和为x的数,再判断两个数组是否分别存在一个点使得加和等于x
-
根据master定理,只有扫描的时间复杂度为O(n),整个算法的时间复杂度才可能为O(nlogn)
如果这两个数分别在左右两边,由于两边的数组是有序的,所以直接用双指针扫描即可
也可以采用先归并排序,在对x - nums[i]进行二分查找的方法,时间复杂度也为O(nlogn)
6.
利用归并排序,在合并过程中,当后面数组的某一个数nums[j]<前面数组的nums[i],则说明此时nums[j]与前面的med - i + 1个数组成逆序对,因为区间(i,med)的数一定大于nums[j]
二、动态规划
知道一个枚举过程,构造递归表达式,递归表达式本质是一张表,表中的每一个状态都可以看作是一个独立的子问题
动态规划不一定都是多项式时间复杂度的
0/1背包为NP完全问题
矩阵连乘和钢条切割很经典,要看一下
1.插入乘号
思想和钢条切割类似,解法见课程试题总结
f(i,k)k可以表示乘号,也可以用加号来做
max{sum(i,j) * f(j + 1, k - 1)} √
max{mult(i, j) + f(j + 1, k - 1) } ×,这种表示是不完全的
2.
区间dp
s
u
m
(
i
,
j
)
=
m
i
n
(
s
u
m
(
i
,
k
)
+
m
a
x
(
A
[
k
+
1
,
j
]
)
)
sum(i, j) = min(sum(i, k) + max(A[k + 1,j]))
sum(i,j)=min(sum(i,k)+max(A[k+1,j]))
s
u
m
(
i
,
j
)
sum(i, j)
sum(i,j)在区间(i, j)中所有区间最大值的最小和
最终结果为sum(1, n)
3.
- 动态规划
- 贪心
从最底端叶子节点着黑色,叶子节点的父节点着白色
因为这题下一个状态只与上一个状态有关
用反证法来证明贪心算法的有效性
4.
和钢条切割类似??
f(i)代表1~i的最佳分词
f(i) = max{f(j) + q(j + 1, i)}
初始值:f(0) = 0
结果为f(n)
//f(i) = max(quality(i, j) + f(j + 1))
5.
有了权重就不好用贪心来做
f(i)用来表示第1~i个活动的最大权重并且i被选了
所以f(i) = max{vi + f(j)},j为上某个与i不冲突的活动
有点像之前的导弹拦截问题
res = max{f(1), f(2), … ,f(n)}
6.
f(v, m)到达v点还剩m块钱,枚举v的邻居u
f(v, m) =min{ f(u, m + B(v)) + E(u,v)}
E(u,v)为路径长度
7.
见课程总结
8.
f(i) = max{ai + 0, ai + f(i + 1)}
f(i)为i~n,包含i
9.
f(i)为i~n,包含i
f(i) = max{1 + f(j)}
三、贪心算法
1.
2.
3.
因为可以部分装入背包,所以可以用贪心的思想,先装入单位价值更大的
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。