本次通过了解总和最大区间问题(即最大子序和)的四种时间复杂度的求解方法,直观地了解了算法复杂度和最优算法的关系。
同时,了解了对优化算法复杂度的判断包含三个内容:对问题边界的认知,对无用功的判断,以及逆向思维。
总和最大区间问题
其实对应最大子序列和问题
对问题复杂度的认识
以上面这道题为例,
Q1. 将例题1.3的线性复杂度算法写成伪代码。(难度系数2颗星)
如下
sum = 0
max = array[0]
for i = 1 to len
if sum <= 0
sum = -∞
else if sum = -∞ and array[i] > 0
sum = array[i]
else
sum += array[i]
if max < sum
max = sum
Q2.在一个数组中寻找一个区间,使得区间内的数字之和等于某个事先给定的数字。
考虑从左往右滑动窗口(l,r)搜索求和,先动窗口右边(往右),一旦超过给定数字就动左边(往右)。若动到左等于右(sum=0),再动窗口右边。
sum = array[0]
l = 0
for r = 1 to len
sum += array[r]
if sum > target
while sum > target
sum -= array[l]
l += 1
if sum == target
break
Q3. 在一个二维矩阵中,寻找一个矩形的区域,使其中的数字之和达到最大值。
问题从一维变成了二维,但实质是一样的,同样是再求最大子序和,只要将二维转化为一维。
转化的方法可以是对于矩阵的每一列,我们将其加在一起,成为了一维上的一个数,二维矩阵的和转化为了一维数组的和。
参考leetcode题解,引用B站up zjutsunny老师的ppt
对每i->j行,都可以把二维问题转化为一维问题。
最大子序列和还有动态规划求解方法。