算法与数据结构(2)

125 阅读6分钟

二叉树递归套路

45a16cc6b8a497c9ac91b8a32d3043a.png

题目

943713da0a5160aad57846deb450eee.png

9a630609311493d8a7a34e42fda3045.png

分析

求以x为头节点树的最大距离

  1. 最大距离与x无关(最大距离不经过x)

1661996532376.png 2. 最大距离与x有关(经过x)左树高度+1+右树 1661996578262.png

要求左右子树返回的信息

  • 整棵树的最大距离
  • 高度

代码

1bcc9adf84514eacd0df16a144c1c7c.png f730bdf34e0c2281fec7124abccfab7.png

题目

image.png 1661997616751.png

分析(列可能性)

大分类:x有关与x无关

cf48a286e13e215b2325a0ffce84678.png

要求左右子树返回的信息

对于左树:

  • 最大子搜索树的size
  • 整个树是不是搜索树
  • 左树的最大值

对于右数:

  • 最大子搜索树的size
  • 整个树是不是搜索树
  • 右数 的最大值

对左右返回的信息求全集

  • 最大子搜索树的size
  • 整个树是不是搜索树
  • 最大值
  • 最小值

代码

ab2bc3f4b9e65b53148d536b12acc69.png

7b12e69e8ead2de1d8ec858572583e5.png

193bc628ea6897fadfd3413bfbac5fd.png

41f4babe7a2a1be3ec5df6e83ace39c.png

题目(多叉树)

1662001251643.png

1662001450690.png

6f560db853590d6276447fe18d1f855.png

分析(列可能性)

大分类:x不来,x来

  1. x来

image.png 2. x不来 image.png

代码 o(n)每个节点只过一遍

52d7bcb43718830b3f23b4a231550c8.png

image.png

打表技巧和矩阵处理技巧

打表

不属于预处理结构,打表出的表独立于程序之外。 a78d2e80ddb2ea86516bfe3f03c4d90.png 重点:应用范围 1662169519094.png

题目

给定一个数组,如何早到他的质数种类

  • 思路一:遍历数组,然后编写求质数的函数,然后一个个求解
  • 思路二:因为数值里的数大小有限,不超过1000,所以先建立一个1-1000数的质数种类表,到时候遍历数组,直接查表。

题目

背后有数学规律 8b6411666c15b7b9c98e28eed55e352.png 方法1:

9c671b9fb82c29add9e0b0d3acc946c.png 方法2: 1662171606868.png

e941dd5a49bbabbd62007cc38fead9a.png

题目

1662171784601.png

image.png

7124c43aca3d112e6c3eea5b8221dda.png

题目

35809b29f86aecc0962fcd0bf4aa3b2.png

18824fc7eaefa78c8ae25d6600b1900.png

10a778b2cf26ad645b03c161388b49f.png

292f0e171211f20d2c83e7254a830a0.png

image.png (num &(num-1))==0 是2的某次方 2的某次方用二进制标识只有一个1

1662175065883.png

题目

一堆开关,两个人,分为先手和后手,选择波动一个开关,使得后边(包括自己)的开关全部反转,谁先使所有开关变为开谁赢。 167c7683ef8aa1c2192e2794a867884.png

矩阵处理技巧

f9cb8e7423e15377ccfe9d0b490253f.png

矩阵特殊轨迹问题

思想:先确定矩阵4个角的坐标 进行宏观调度

如何打印 ac28fc6eb2ee9253bc79609b224e3cb.png

d5d3107999ed43c280538acca9be51f.png

81f100950087d362f1dce39311ad335.jpg

fd01700e9b7f341596ddc99c4575d9d.png

转圈打印

aaf3d7c65321fedd6ea18e4c1272865.png 1662178190024.png

ce5415a1cf056ec58eeeb166b06b9c0.png

aea86314d4e451fa4154565a9f32728.png

原地旋转正方形矩阵

image.png 分圈结构:外边的数在外边,里边的数在里边

1662178752112.png

并查集结果和图相关算法

贪心

96a15078ff6c5ab57a4143b8c0dd770.png

1662256721968.png

堆和排序的贪心的常用技巧

题目

1662256393832.png

暴力方法

80dbb1dd51539291b535930a9790a1f.png d06e81c0f96ffe0f54e1b0f928c1e31.png

cc61275217325ed01de81f37088b9eb.png

贪心方法

找结束时间最早的 1662259336841.png

题目

1662259797055.png

暴力算法

给每个位置设置放灯和不放灯两个选项,枚举出所有点,筛选出不能全部照亮的,然后再找出灯最少的。

image.png light要恢复现场,因为一直都使用的一个light image.png

贪心算法

1662366496702.png

题目

278ac99acc1fdf9a0c367b36b7ce980.png

暴力枚举

9e3decbcd9f9a8c33d4c2e69afbc273.png

贪心

先建小根堆,然后弹出堆中前两个数加和,然后放回,最后加和为一个数 1662368128731.png

b0b6263c7e1145c0829aaa9a204a067.png

题目

93d82c59cc30ceec9525ed486dad404.png 类似于找在自己能力范围下,找利润最大的做,赚到钱以后,扩大自己的能力范围,在找利润最大的做。 3f16d1030837ccf81f8d21a0e05b293.jpg

并查集 解决连通性

e74dd593809215461b0a31f60527211.png

设计方法

isSameSet(V x,V y) 1662428592240.png union() b45849f41f22bd6a63a2eff5cfbc96b.png

代码

image.png 39f881aa5694b8b7f348a06181b8ca4.png image.png

代码优化

优化findfather 因为并查集时间复杂度和findfather直接相关 image.png

6b1105bf7a810336778b125502b52ac.png

663b141820e86d2b67dcfbd9f5061dd.png 调用足够频繁 单次调用o(1)

题目

1662432843379.png

1662432898926.png

47b664c7ab5e09efca4c574a3623ca3.png

代码

3e537683e3c7cb2f4d488305f04b1f9.png

dccd2376b56ccc6590f2a80434b9637.png

7a672521e13b04ed12cfdeac1139c98.png

p12 暴力递归&图算法

85e6d19c6330e28cd70eadc80dbec30.png

1662524878337.png

图的表示

1662519880686.png

邻接表法

从各点出发可以直接到达的邻居 5812732462387d7df87983d41108932.png

邻接矩阵法

1662520406403.png

其他表示方法

1662520625751.png

实际使用方法 模板

不管题目是什么结构表示图,先将题目的结构转化为自己熟悉的结构

79c2b2a575ab9289301ab8fa6120592.png

1662523327023.png

e14e39d178ddbca76db8dd749f60e2a.png

转化方法 将其他表示法转化为模板表示法

1662523410005.png

e88843e62042fd684bcd6fc545ecfa2.jpg

图的遍历

0f2e7cb4389177be4e5bca658439063.png

宽度

1662534600486.png

深度

1662536080350.png

拓扑排序

1403f608aa3931a7dc1cba6b0aa29d1.png

1662537296656.png

image.png

1662538109207.png

最小生成数

1662538199238.png

代码 k算法 克鲁斯卡尔算法(并查集思想)

1662538341782.png

1662539619534.png 799eb47c9b8ba1ab1e7aea71c95ba6c.png

1e41d3b3c5d2a8e0df7c4edfe83d96c.png

d5cca041d911e69f2e8c3b4cd0177e0.png

image.png

a46be08c31e01256dd502c430db6a2d.png

p算法 普利姆算法 不需要并查集 只需要set即可

image.png

daac4d7d4f8fd02c85cdc2653e741c3.png 1feb6df3cda73f1c51b038bacc7b73f.png 1662542816701.png

dijkstra

e0731441465a1a4608809f65de88bf0.png

1662865003780.png

代码

f57b0323a4cb8e3428f867f76a61fbb.jpg

fbd9c43a6d3ad2939ef0a2cd07a6b0b.png

a17927fd73f8421e1d7d004fb128930.png

代码(版本二) 使用小根堆比遍历时间复杂度低

bc582cdff91417b87680a56a861d4c6.png 主流程 960d17504fa962166dfe82348861a51.png 自己写堆

ff7d7e133c991189e6fe35b564393e7.png

e361995ca029b648dbab58918269dea.jpg

feb07629003e74a63db25ec8d483833.png

140e3a660b79ac6dc369dd08076f253.png

6e4eddadf50f87d43bf6bc354ad5ce6.jpg

暴力递归

1662868858207.png

382899c7e54ba38431678f668e0af31.png

汉诺塔

三个杆 上边套盘子,盘子需要小压大

b852d9e369b77405394354736d51181.png 问题 如果n个盘子在左杆 如何把盘子放入右杆 大方向

  1. 1-n-1个盘子 从左到中
  2. 第n个盘子 从左到右
  3. 1-n-1 从中到右

f2b18635caceba8e2da64d25abfdd9c.png

1663124635832.png

ad9710375c67db05e027a51d7a02f4a.png b7a7bcca34f94468625320a9d9bada7.png n层汉诺塔 移动2^n-1步

题目

8d784240f9f3a9fef8c490f0ab9abf0.png

1663126235187.png

1663126487129.png

ec0a34fefbe93fca5086277ae414cfc.png

题目

打印一个字符串的全部子序列

0a3fb02cf20ddb9bf18acd6d416bb47.png

1a29f234a8ac47e1afa4bf482c9c947.png

题目

打印一个字符串的全部子序列(子序列中有重复字符),要求不出现重复字面值的子序列。

4d0a03eb383058d9e21005012301c5d.png

题目 打印一个字符串的全部排列

14f2e741f9b5d965e4c6a37493cad5b.png

1663227607702.png

打印一个字符串的全部排序,要求不出现重复的排列

方法一 利用hashset的属性(暴力递归加过滤)

1663228305357.png 方法二 分支限界 (暴力递归 但对应一些不符合条件的支路直接杀死) 1663229035772.png 1663229369222.png

字符串转换题目

注意只需要结果的个数 不需要具体的字符串 1663229583948.png 1590d946c5bfb1c0421a54cb6a6e712.jpg e51027a7303f17495a8ccfd198598c4.png

字符串转换改进(暴力递归到动态规划)

甚至不需要看题意,直接根据暴力递归代码来改

1663736616085.png

1663737066397.png

26444621be9a2726d3d48283f7f0b34.png

1663744819587.png

背包问题

1663231276934.png 方法1 5ca132b8377649c97d0644e5e6e3df7.jpg 方法2 d85f8740b4b31542dec2d9b30a2b809.png f15cf63ebff327e1f76db05ce5d4be0.png 1663243888714.png

背包问题改进(暴力递归到动态规划)

845dd5433e826a79ba036ae158e2a1e.png 列出dp表 15fbc509e23db80935651a65717f499.png image.png

题目 (非从左到右的模型)

7a21375a4f6676b45a1f51e822bcf41.png

845dd5433e826a79ba036ae158e2a1e.png

image.png

1663245803327.png

a250512a3af59a37f9f472961d5e66e.png

问题改进(暴力递归到动态规划)

1663747211866.png

image.png

78225c7aec9511966c688b1c3b5e58c.png

0b56712405501f7e853a91d0f8b48f0.png

题目 n皇后问题

609337930b9af4b9325e08d0849d63b.png

03b04948242fa147042b0e40cc1e92c.jpg 条件判断 6581f00d5f32d416a1b99fd97b63805.png

982f031d00d4539f2809cf009f58096.png

优化:位运算 只是加速了常数时间

96991af52b9620d9fa755f15c6c0506.png 将列 左 右 或运算 就变成了总限制
进一步求下一步的总限制

1663297957888.png 1663297795737.png

31c172725d0e2888f0cff5853f07e69.png

代码

1663298269817_BCC237E6-6E73-4093-8397-C4CCC581C4DF.png

1663299408918.png 复杂度o(n^n)

如何在面试中尝试一件事

e890318da170736868f57bea7638771.png

image.png

暴力递归到动态规划

image.png

1663312924103.png

题目 斐波那契数列

752743a7a295e939c9ea0657dbe45e2.png

题目

b5391f57835278b3a8d1e05efb3cd81.png

1663313418070_F61B37C5-5038-41c1-8F5E-E4D2BFCA0D51.png

image.png 有重复的子过程,可以优化 image.png

优化1 将cur和rest的组合,返回的结果,加入缓存中

image.png

这就是动态规划 1663314635452.png

1663314601081_D66E5CFF-17C1-41cf-812D-53B2EEF6A41A.png dp表就是所有状态对应的值 1663315481648_98FCBD1E-4E97-4bac-A216-9165B9F43122.png 暴力递归的分析规程 就是动态规划的转移方程 所有的动态规划都一定来着于一个暴力递归

暴力递归->记忆化搜索->经典动态规划(粒度更细)

4a9e7cf77ed3de791cd95b593fa2e70.png

题目

一个数组[7,3,100,52] 数组中每个位置的值是货币的面值,每一种面值都可以使用任意张,arr中都是正数,无重复值,假定目标钱是1000,问有几种方法可以组成1000这个面值.

暴力递归

0b694a00a3b4eae83fefdd775aaf944.png

记忆化搜索

e6cfc8d1672242f256040aa0a5b2f37.png

f1ccba8400b0589ec11f7489e380130.png

cd9f4e52b139c00650e657404723b56.png

经典动态规划

ac66e90abf5a0a917a1680f025423ba.png 存在枚举行为 e0dce3f9e70a8082b093de0568e7d8a.png

bdac6cec90c483aac0139bda486bde7.png

消除枚举的动态规划

af3a635ce7352b79ed64486686d8b12.png

题目二

7a22fc06101c20f9341c89e7d763df3.png

1663813175031.png

06e4e1d716bbc32af37749ebbf90ebe.png

ffda9b9863fdc290cf126df77f115fb.png

小贪心 image.png

image.png

结论

**如果只有一个可变参数 而且情况太多 就直接用傻缓存吧 ** 可变参数不要超过整型以上

de5df875301c72147cddb0d17b62ebb.png

cd7a156c0eb21432e6c0123b2276e2c.png

6f69cc02474f4152fda45a967b7af8d.png

1663834639235.png

8c98c2f96bed4e673dc1de4ae80f1a8.png

daf7ed461e230647e42bff04b0fc9c4.png

632dd5f26facd9dff14c3a1a7c6d278.png

动态规划优化:空间压缩

多样本位置全对应的尝试模型

图片.png

题目:两个字符串的最长公共子序列问题

38b64e65d5818dc6d79ff104e0ff7c4.png

47387956d6c175d5c18bf5531046106.png

图片.png

dp[i][j]的求解

  • 情况1 最大公共子序列可能既不以str1[i]结尾,也不以str2[j]结尾 dp[i][j]=dp[i-1][j-1]
  • 情况2 最大公共子序列可能以str1[i]结尾,但不以str2[j]结尾 dp[i][j]=dp[i][j-1]
  • 情况3 最大公共子序列可能不以str1[i]结尾,但以str2[j]结尾 dp[i][j]=dp[i-1][j]
  • 情况4 最大公共子序列可能以str1[i]结尾,又以str2[j]结尾 dp[i][j]=dp[i-1][j-1]+1

代码

image.png

寻找业务限制的模型

题目

e7779f24454ac513d024637e11e509a.png

lQLPJxa2WafG74_NAhvNBEawHSGGmtPB1boDK9QzLABMAA_1094_539.png

lQLPJxa2Wnouc2jM7M0DiLCCU2qSv2o14QMr1YtmQB0A_904_236.png

改动态规划

5d4aa918916bc95a40ce01ae2f92671.png

1663920080952_3511F2CF-C880-4ce9-83A7-9E3B06B33B57.png

图片.png