算法课ppt复习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

一、分治

1.poj 3714

在这里插入图片描述

  1. 分别找到两个数组的中位数,两者进行比较,每次就能剔除一半的数字
  2. 长度不一样时,
    如果两个数组数字个数之和为奇数则为最中间的数,即找到第(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.

在这里插入图片描述
求这些矩形的轮廓线

  1. 将这些矩形一分为2,先求左边矩阵的轮廓线,再求右边矩形的轮廓线,再合并
  2. 合并方法:从左到右扫描,h为0为起点,下一次h为0为末端。每次取max(h1, h2)。并不需要对整个坐标轴进行枚举,只需要对离散的坐标点的位置进行枚举

3.最大子数组问题

在这里插入图片描述
看到nlogn就可以想到要分治

  1. 三种情况,最大子数组在左、在右和左右两部分都含有
  2. 左边求最大值A,右边求最大值B,中间两边都有的最大值就是两边的最大值相加,即C = A + B
    A不是指左边区间的最大子序和,因为这可能和右边的最大子序和的区间不是连续的
    A是从mid为区间起点开始向左遍历找到那个使得区间内数最大的区间中点,B同理
  3. 返回结果为max{leftmax, rightmax, C}

master定理 https://zhuanlan.zhihu.com/p/113406812

4.

在这里插入图片描述
扫描一遍,因为数组是有序的,看左边比右边大的那个位置移动了多少
一分为二来扫描,通过mid与l和r比较来继续划分

5.

在这里插入图片描述
二分

  1. 左右两边分别找有没有两个数之和为x的两个数。这个步骤采用归并排序,在排序的merge过程中先判断左右两个数组是否存在和为x的数,再判断两个数组是否分别存在一个点使得加和等于x

  2. 根据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.

在这里插入图片描述

  1. 动态规划
  2. 贪心
    从最底端叶子节点着黑色,叶子节点的父节点着白色
    因为这题下一个状态只与上一个状态有关
    用反证法来证明贪心算法的有效性

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提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值