算法总纲-算法范式与技巧[目录]

简介

目前收录了共[76]道必会题

目录

1.回溯算法

1.1 二维搜索问题

这种问题已经属于已经定式的解法,核心就是上下左右移动以及海洋包围城市
  1. 被围绕的区域
  2. 飞地的数量
  3. 矩阵中的路径
  4. 机器人的运动范围

1.2 全排列问题

  1. 打印从1到最大的n位数
  2. 手机打字的

1.3 组合问题

1.4 子集问题

2.动态规划

2.1递推问题

  1. 斐波那契问题
    dp[i] = dp[i-1]+dp[i-2]
  2. 把数字翻译成字符串
    d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] (  atoi  ( sub ⁡ str ⁡ ( i , 2 ) ) < = 25 & &  atoi  ( substr ⁡ ( i , 2 ) ) > = 10 ) = d p [ i − 2 ] (  atoi  ( substr ⁡ ( i , 2 ) ) > 25 & &  atoi  ( substr ⁡ ( i , 2 ) ) < 10 ) \begin{aligned} \mathrm{dp}[\mathrm{i}] &=\mathrm{dp}[\mathrm{i}-1]+\mathrm{dp}[\mathrm{i}-2](\text { atoi }(\operatorname{sub} \operatorname{str}(\mathrm{i}, 2))<=25 \& \& \text { atoi }(\operatorname{substr}(\mathrm{i}, 2))>=10) \\ &=\mathrm{dp}[\mathrm{i}-2](\text { atoi }(\operatorname{substr}(\mathrm{i}, 2))>25 \& \& \text { atoi }(\operatorname{substr}(\mathrm{i}, 2))<10) \end{aligned} dp[i]=dp[i1]+dp[i2]( atoi (substr(i,2))<=25&& atoi (substr(i,2))>=10)=dp[i2]( atoi (substr(i,2))>25&& atoi (substr(i,2))<10)
  3. 青蛙跳台阶
    dp[i] = dp[i-1]+dp[i-2]

2.2 累加问题

  1. 最长斐波那契
    dp ⁡ [ i ] [ j ] = max ⁡ ( d p [ k ] [ i ] + 1 , d p [ i ] [ j ] ) \operatorname{dp}[i][j]=\max (d p[k][i]+1, d p[i][j]) dp[i][j]=max(dp[k][i]+1,dp[i][j])

  2. 最长递增子序列
    dp ⁡ [ i ] = max ⁡ ( dp ⁡ [ i ] , d p [ j ] + 1 ) \operatorname{dp}[\mathrm{i}]=\max (\operatorname{dp}[\mathrm{i}], \mathrm{dp}[\mathrm{j}]+1) dp[i]=max(dp[i],dp[j]+1)

  3. 最大正方形
    d p [ i ] [ j ] = min ⁡ ( min ⁡ ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − 1 ] ) , d p [ i ] [ j − 1 ] ) + 1 d p[i][j]=\min (\min (d p[i-1][j], d p[i-1][j-1]), d p[i][j-1])+1 dp[i][j]=min(min(dp[i1][j],dp[i1][j1]),dp[i][j1])+1

  4. 兑换零钱
    dp ⁡ [ i ] = min ⁡ ( d p [ i ] , d p [ i − k ] + 1 ) \operatorname{dp}[\mathrm{i}]=\min (d p[i], d p[i-k]+1) dp[i]=min(dp[i],dp[ik]+1)

  5. 剪绳子
    d p [ i ] = m a x ( d p [ i ] , m a x ( ( i − j ) ∗ j , d p [ i − j ] ∗ j ) ) dp[i] = max(dp[i],max((i-j)*j,dp[i-j]*j)) dp[i]=max(dp[i],max((ij)j,dp[ij]j))

  6. 礼物的最大价值
    d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) + g r i d [ i − 1 ] [ j − 1 ] dp[i][j] = max(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1] dp[i][j]=max(dp[i1][j],dp[i][j1])+grid[i1][j1]

  7. 打家劫舍
    d p [ i ] = m a x ( d p [ i − 2 ] + n u m s [ i ] , d p [ i − 1 ] ) ; dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]); dp[i]=max(dp[i2]+nums[i],dp[i1]);

2.3 最优选择[极值]

  1. 买入和卖出两种状态
    d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 1 ] − p r i c e s [ i ] , d p [ i − 1 ] [ 0 ] ) ; dp[i][0] = max(dp[i-1][1] - prices[i],dp[i - 1][0]); dp[i][0]=max(dp[i1][1]prices[i],dp[i1][0]);
    d p [ i ] [ 1 ] = m a x ( d p [ i − 1 ] [ 0 ] + p r i c e s [ i ] , d p [ i − 1 ] [ 1 ] ) ; dp[i][1] = max(dp[i-1][0] + prices[i],dp[i - 1][1]); dp[i][1]=max(dp[i1][0]+prices[i],dp[i1][1]);
  2. 包含买入,卖出,冷冻期
    d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 1 ] − p r i c e s [ i ] , d p [ i − 1 ] [ 0 ] ) ; d p [ i ] [ 1 ] = m a x ( d p [ i − 1 ] [ 1 ] , d p [ i − 1 ] [ 2 ] ) ; d p [ i ] [ 2 ] = d p [ i − 1 ] [ 0 ] + p r i c e s [ i ] ; dp[i][0] = max(dp[i-1][1] - prices[i],dp[i-1][0]);\\ dp[i][1] = max(dp[i-1][1],dp[i - 1][2]);\\ dp[i][2] = dp[i-1][0] + prices[i]; dp[i][0]=max(dp[i1][1]prices[i],dp[i1][0]);dp[i][1]=max(dp[i1][1],dp[i1][2]);dp[i][2]=dp[i1][0]+prices[i];
  3. 连续数组的最大和
    n u m s [ i ] + = m a x ( n u m s [ i − 1 ] , 0 ) ; nums[i] += max(nums[i - 1],0); nums[i]+=max(nums[i1],0);

2.5 背包问题

2.5.1 0,1背包问题
  1. 分割等和子集
    d p [ i ] [ j ] = d p [ i − 1 ] [ j − n u m s [ i ] ] ∣ ( o r ) d p [ i − 1 ] [ j ] ; j > = n u m s [ i ] d p [ i ] [ j ] = d p [ i − 1 ] [ j ] ; j < n u m s [ i ] dp[i][j] = dp[i - 1][j-nums[i]]|(or)dp[i-1][j];j>=nums[i] \\ dp[i][j] = dp[i-1][j];j<nums[i] dp[i][j]=dp[i1][jnums[i]](or)dp[i1][j];j>=nums[i]dp[i][j]=dp[i1][j];j<nums[i]

  2. 一和零

  3. d p [ i ] [ j ] [ k ] = m a x ( d p [ i ] [ j ] [ k ] , d p [ i − 1 ] [ j − z e r o s ] [ k − o n e s ] + 1 ) ; dp[i][j][k] = max(dp[i][j][k], dp[i - 1][j - zeros][k - ones] + 1); dp[i][j][k]=max(dp[i][j][k],dp[i1][jzeros][kones]+1);

  4. 目标和
    d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i − 1 ] [ j − n u m s [ i ] ] ; j > = n u m s [ i ] d p [ i ] [ j ] = d p [ i − 1 ] [ j ] ; j < n u m s [ i ] dp[i][j] = dp[i - 1][j]+dp[i - 1][j - nums[i]];j>=nums[i] \\ dp[i][j] = dp[i - 1][j];j<nums[i] dp[i][j]=dp[i1][j]+dp[i1][jnums[i]];j>=nums[i]dp[i][j]=dp[i1][j];j<nums[i]

2.5.2 完全背包问题
  1. 完全平方数
  2. 兑换硬币

3.数组常规性问题

3.1 基础类型的空间换时间

3.1.1 使用hash降低时间复杂度
  1. 两数之和

  2. 找到所有数组中消失的数字

  3. 扑克牌中的顺子

3.1.2 使用vector降低时间复杂度
  1. 替换空格

3.2 滑动窗口降低时间复杂度

  1. 无重复字符的最长子串

3.3 排序降低空间复杂度和时间复杂度

  1. 数组中重复的数字
  2. 最短连续无序子数组

3.4 中心扩展法

  1. 回文子串
  2. 最长回文子串

3.5 前缀和问题

  1. 寻找数组的中心下标
  2. 和为K的子数组
  3. 和为s的连续正数序列

3.6 双指针法

  1. 翻转单词顺序

3.7 二分法

  1. n-1中缺失的数字

3.8 连乘连加[三角技巧]

  1. 构建乘积数组

3.9 概率问题

  1. n个骰子的点数

3.10 排序

  1. 冒泡
  2. 快排
  3. 归并
  4. 堆排序

4.树

4.1 二叉搜索树性质

  1. 二维数组中的查找

4.2 平衡二叉树性质

  1. 判断平衡二叉树

4.3 最近公共祖先

  1. 二叉搜索树的公共祖先
  2. 二叉树的公共祖先

4.4 建树

  1. 根据先序和中序遍历建立二叉树
  2. 根据升序链表重建二叉搜索树
  3. 根据后序和中序遍历建立二叉树
  4. 根据先序建立二叉树

4.5 遍历

  1. 二叉树的前序遍历[队列]
  2. 中序遍历[栈]
  3. 后序遍历[先序反遍历]

5.链表

4.1 链表翻转

  1. 打印链表
  2. 翻转单词顺序
  3. k个一组翻转

4.2 环问题

  1. 判断是否存在环
  2. 判断环的位置

4.3 交点

  1. 判断是否存在交点
  2. 求交点的位置

4.4 求和

  1. 两个链表求和

6. 贪心问题

贪心问题的核心在于每一步都想要最好的,
比如剪绳子2,我每一步都希望积最大,所以我挑选每一次都在3的位置噶一刀,
比如A*算法,我每一次都沿着里面目标的距离最小的进行移动
  1. 剪绳子2
  2. A*算法
  3. 买股票1

7. 乱七八糟的题目

7.1 字典序问题

7.2 位运算问题

  1. 不用加减乘除计算和
  2. 汉明重量
  3. 汉明距离

7.3 数学推导

  1. 约瑟夫环问题

7.4 模拟

  1. 顺时针打印矩阵

7.5 一些内部库函数的实现

  1. 不依赖加减乘除实现加法和减法
  2. 不依赖pow实现幂函数[快速幂]

7.6 一些代码特性

  1. 利用短路效应实现1+2+3…

8.队列

8.1 双向队列

  1. 队列的最大值

9.大顶堆与小顶堆

  1. 会议室|
  2. 会议室||

10.找规律

  1. 杨辉三角
  2. 汉诺塔
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值