DFS/回溯

以整数拆分为例:

剪枝条件

  • 当和为n时,保存结果
  • 当和大于n时,进行剪枝

在DFS中,同一排的结点是在同一个函数调用中进行处理,如上图中的第一排,1、2、3、4、这4个结点是在第一次函数调用中进行处理。

因此使用一个for循环来处理同一排的结点。
因为元素可以重复取用,本来for循环的起始位置应该都为1,但是为了避免重复,我们可以假设for循环的起始位置为其父节点的值,这里用变量index表示

vector<int> res;
//n表示要拆分的数 index表示当前函数从哪个数开始拆 sum表示当前的和
void split(int n,int index,int sum) {if (sum == n) {//保存结果myPrint(res);return;}if (sum > n) return;//剪枝for (int i = index; i < n; ++i) {res.push_back(i);//元素可以重复使用,下一次还是从i开始拆分,拆到n为止split(n, i, sum + i);res.pop_back();}
}

77 组合
216. 组合总和 III
39. 组合总和
17. 电话号码的字母组合
40. 组合总和 II
90. 子集 II
47. 全排列 II
679. 24点游戏
687. 最长同值路径

动态规划

一个超级实用的视频
状态表示:
f 函数代表什么状态?
写出状态表示之后我们会有一个f函数的集合,代表递推到f(i)时,有多少种可能的状态。

动态转移方程
把集合中的每一种可能表示出来,对应要求的结果(求最大、最小、求和等)写出动态转移方程。

  • 状态表示
  • 状态集,从状态集求出当前状态

思考当前状态对比前一个状态会有什么变化:

  • 从前一步加1?
  • 等于前一步?

如下图所示

路径和有关的题目
714. 买卖股票的最佳时机含手续费
139. 单词拆分
343. 整数拆分
337. 打家劫舍 III
300. 最长递增子序列
940. 不同的子序列 II
2400. 恰好移动 k 步到达某一位置的方法数目
646. 最长数对链
120. 三角形最小路径和
907. 子数组的最小值之和
44. 通配符匹配
72. 编辑距离

贪心

每次选取局部最优解,得到最终的最优解。
2406. 将区间分为最少组数
406. 根据身高重建队列
452. 用最少数量的箭引爆气球

数据结构

优先队列

//升序队列 小顶堆
priority_queue <int,vector<int>,greater<int>> q;
//降序队列  大顶堆 默认情况
priority_queue <int,vector<int>,less<int>> q;

2406. 将区间分为最少组数
239. 滑动窗口最大值
2402. 会议室 III
23. 合并k个有序链表

数组/链表/哈希

数组: 查找效率高,插入和删除效率低
链表: 插入删除效率高,查找效率低

哈希:

  • 思想:通过哈希函数得到的键值,使其能够高效查找
  • 当键值重复时,处理哈希冲突
  • 在C++中unordered_set 和unordered_map的底层实现时哈希表

454. 四数相加 II
2405. 子字符串的最优划分
6221. 最流行的视频创作者

栈/队列

907. 子数组的最小值之和
1106. 解析布尔表达式

单调栈

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。
739. 每日温度
503. 下一个更大元素 II

前缀树

前缀树

并查集

并查集由两个部分构成:

  • find()函数,发现x的根
  • Union()函数,合并
//发现x的根,最初每个元素的根都是自己
int myfind(vector<int> &parent, int x) {if(parent[x] != x) {parent[x] = myfind(parent,parent[x]);}return parent[x];}
//将y的根给x的根,将x和y合并为一堆
void myunion(vector<int> &parent,int x,int y) {parent[myfind(parent,x)] = myfind(parent,y);}

并查集
886. 可能的二分法
934. 最短的桥 BFS+DFS

线段树

双指针/滑动窗口

主要是考虑左指针往右走的条件。
209. 长度最小的子数组
76. 最小覆盖子串
90. 水果成蓝
239. 滑动窗口最大值
2401. 最长优雅子数组
915. 分割数组
75. 颜色分类
19. 删除链表的倒数第 N 个结点

对于二叉树来书,考虑遍历方式:

  • 前序遍历:先处理父节点,再处理孩子节点
  • 中序遍历:先处理左孩子,再处理父节点,最后处理右孩子
  • 后序遍历:先处理孩子结点,再处理父节点

大部分题目都是使用的后序遍历来求解:因为处理父节点时往往需要用到子节点的结果

106. 从中序与后序遍历序列构造二叉树
98. 验证二叉搜索树
236. 二叉树的最近公共祖先
701. 二叉搜索树中的插入操作
998. 最大二叉树 II
538. 把二叉搜索树转换为累加树
6242. 二叉搜索树最近节点查询 序列化二叉搜索树

位运算

操作 结果 特性
~ 取反,0变为1,1变为0
a&b 且,ab同时为1时才取1 a & b <= min(a,b),交换律、结合律,越取越小
a 或 b a和b其中有一个为1,最终结果就是1 越取越大
a ^ b a和b相同时为1,不同为0
<< 和 >> 左移一位,相当于*2,右移一位,相当于/2

2419. 按位与最大的最长子数组

模拟

根据题意模拟,主要是代码细节要注意。
59. 螺旋矩阵 II
LCP 63. 弹珠游戏
1441. 用栈操作构建数组
779. 第K个语法符号
6222. 美丽整数的最小增量
1620. 网络信号最好的坐标
775. 全局倒置与局部倒置

数学

主要多考虑组合数学

从起点到终点的所有路径:给定一个nnn和一个k,nk,nk,n代表要走的步数,kkk代表终点,从0出发,每次可以选择往左走或者往右走,走到kkk,有多少种路径?

  1. 假设aaa等于往右走的步数,往左走的步数为k−ak-ak−a,走到nnn时的步数为a−(k−a)=aa-(k-a)=aa−(k−a)=a,a=(k+n)/2a=(k+n)/2a=(k+n)/2
  2. 当且仅当(k+n)(k+n)(k+n)为偶数时有解
  3. 等价于从kkk步里面选aaa步往右走,所以结果是Ck(k+n)/2C^{(k+n)/2}_kCk(k+n)/2​

2400. 恰好移动 k 步到达某一位置的方法数目

C++如何计算组合数?

n个里面选m个,当前这个选,就变为从n-1个里面选m-1个,当前不选,就变成从n-1个里面选m个。

根据公式::Cnm=Cn−1m+Cn−1m−1C_n^m=C^m_{n-1}+C_{n-1}^{m-1}Cnm​=Cn−1m​+Cn−1m−1​

#include<iostream>
using namespace std;long long res[67][67]={0};
long long C(long long n,long long m){if(m==0 || m==n) return 1;if(res[n][m] != 0)return res[n][m];//保存状态return res[n][m] = C(n-1,m)+ C(n-1,m-1);//赋值给res[n][m]并返回
}
int main()
{printf("%ld",C(6,3));return 0;
}

排序不等式:
a1≤a2≤...≤ana_1 \leq a_2 \leq ... \leq a_na1​≤a2​≤...≤an​
b1≤b2≤...≤bnb_1 \leq b_2 \leq ... \leq b_nb1​≤b2​≤...≤bn​

最大值= a1b1+a2b2+...+anbna_1b_1+a_2b_2+...+a_nb_na1​b1​+a2​b2​+...+an​bn​
最小值= a1bn+a2bn−1+...+anb1a_1b_n+a_2b_{n-1}+...+a_nb_1a1​bn​+a2​bn−1​+...+an​b1​

求解最大公约数和最小公倍数

  • 最大公约数:数组中所有数都能整除的最大数
  • 最小公倍数:数组中所有数的最小倍数

a和b的最小公倍数=a∗b/(a和b的最大公约数)a和b的最小公倍数=a*b/(a和b的最大公约数)a和b的最小公倍数=a∗b/(a和b的最大公约数)
求解最大公约数使用gcd(a,b)函数

902. 最大为 N 的数字组合
6234. 最小公倍数为 K 的子数组数目
2447. 最大公因数等于 K 的子数组数目

【leetcode】【题解合集】相关推荐

  1. LeetCode(合集)括号 golang

    LeetCode(合集)括号 20. 有效的括号 golang(三) 22. 括号生成 golang 图解

  2. 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

    Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offe ...

  3. LeetCode整理----合集一

    一:LeetCode[2]  两个数相加 1:需要考虑进位的问题,需要使用一个变量存储进位标识,每一次都去判断,而且在一个链表判断完成之后,另外一个链表,也是需要单独考虑进位问题的 2:在计算结束后, ...

  4. [PTA]2021天梯赛-总决赛 L1题解合集

    文章目录 前言说明 题解 人与神 (5 分) 两小时学完C语言 (5 分) 强迫症 (10 分) 降价提醒机器人 (10 分) 大笨钟的心情 (15 分) 吉老师的回归 (15 分) 天梯赛的善良 ( ...

  5. LeetCode (合集)合并链表和数组

    LeetCode 88. 合并两个有序数组 golang LeetCode 21. 合并两个有序链表 golang 合并两个有序链表并去重 /*** Definition for singly-lin ...

  6. LeetCode(合集)两数之和总结 (1,167,1346)

    1.两数之和 167. 两数之和 II - 输入有序数组 golang 1346. 检查整数及其两倍数是否存在 一个数组是否存在两个数是target的整数倍? 如果有人知道这是LeetCode哪个题, ...

  7. QLU寒假训练赛题解合集

    为了节省版面: 1.所有寒假训练赛题解都集中在这一篇里 2.所有题解代码都可以直接点击题目链接查看 0115 A题:签到,输出n+1 B题:签到,从左端点向右找一段和小于0的区间,再从右往左找 C题: ...

  8. ZZULIOJ1001~1100题解合集

    前言: 从本篇文章开始,将开始对ZZULIOJ上前200道基础常见的算法题进行讲解并发表下个人看法,本人能力有限,就当给大家提供一下解题的思路.这些题都是一些C语言中的常见题型,大家千万不要直接复制粘 ...

  9. 【算法笔记】重刷PAT 题解合集

    乙级1001 #include<iostream> using namespace std; int main() {int n;cin >> n;int cnt = 0;wh ...

最新文章

  1. Spring基础专题——第八章(事务)
  2. 如何成为Java程序员
  3. reactjs定义组件:类式组件
  4. 什么是JAX-RS注释? (第2部分)
  5. 测试驱动开发 测试前移_测试驱动开发–双赢策略
  6. 灵格斯怎么屏幕取词_电脑包尺寸怎么选?手提的好还是双肩的好?比较推荐哪款电脑包?...
  7. SQL中的事物【转】
  8. Java与MySQL连接报错_java连接数据库报错(
  9. [网摘]动态SQL中set与select对变量赋值的影响
  10. pythonfor久久_python 九九乘法表 for循环
  11. c# 多线程单例模式_单例模式,多线程单例,双重锁定单例,工场单例创建上下文...
  12. python人门指南小说-Python入门深度学习完整指南
  13. MyBatis 动态SQL与SQL片段
  14. PowerDesigner数据模型(CDM—PDM)
  15. cd rom是计算机的,CD-ROM是什么意思,CD-ROM是什么意思
  16. 电脑桌面便签软件怎么通过便签快捷键快速云同步便签内容?
  17. awk从atq检索第一个字段报告 [英]awk to retrieve the first field report from atq
  18. Android中GPUImage的简单使用
  19. 扩充计算机内存是扩充什么,怎么增加电脑内存 三种方法让你电脑内存扩大
  20. 微信小程序实现瀑布流实例

热门文章

  1. Windows10远程桌面连接CentOS7
  2. Python数据分析挖掘案例:Python爬虫助力疫情数据追踪
  3. java终结者怎么样_终结者6:丹妮与约翰康纳相比怎么样?她绝对也是个好领袖!...
  4. xshell上传本地文件命令_XShell上传、下载本地文件到linux服务器
  5. python系列26:numpy稀疏矩阵笔记
  6. 地平线与福瑞泰克达成前装量产合作,助力国产ADAS突围
  7. python市场饱和了没_软件测试市场饱和了?不,是你的能力“饱和”了
  8. 富世华推出基于人工智能的全轮驱动机器人割草机
  9. P4172 [WC2006]水管局长
  10. 小程序分享自己的二维码 保存到相册