算法
内含Leetcode前300道免费题,剑指offer全套以及一些算法竞赛题目的题解。
DataPlayerK
这个作者很懒,什么都没留下…
展开
-
三种枚举(指数型,组合型,排列型)深度优先搜索DFS基础题
三种枚举(指数型,组合型,排列型)深度优先搜索DFS基础题题目描述思路分析代码实现题目描述指数型枚举DFS.组合型枚举DFS.排列型枚举DFS.思路分析DFS基础DFS思考:搜索顺序和需要的参数。记录答案可以二进制存,或者直接开全局path数组。代码实现//递归实现指数型枚举#include<bits/stdc++.h>using namespace std;int n;void dfs(int u,int state){ if(u==n){原创 2021-09-17 15:22:34 · 207 阅读 · 0 评论 -
基本算法-位运算-最短Hamilton路径
基本算法-位运算-最短Hamilton路径题目描述思路分析代码实现题目描述点这里.思路分析状态压缩dp的经典入门题。一句话来概括状态压缩dp:就是用个二进制数来表示状态,1和用每位上的0表示某个二元状态,仅此而已。f[M][N]数组表示前n-1个状态是M(一个二进制数)且最后一个点是n的最短路径。状态转移就是遍历所有可能的状态,对任何一个状态再遍历这个状态的每一位,如果这一位是1则可以转移。转移过程就是遍历除了j的所有点,从这些点转移到j,遍历全程取Min。代码实现#include<原创 2021-09-15 14:50:07 · 239 阅读 · 0 评论 -
基本算法-递推与递归-费解的开关
基本算法-递推与递归-费解的开关题目描述思路分析代码实现题目描述点这里思路分析可以BFS,从全亮状态走6步,预处理能走到的状态,用哈希存下来。然后读入,相当于打表。ans记录答案。但最优做法应该是递推。假设第一行固定,并用res表示操作数。第一行的状态只能由第二行的操作改变,以此类推。因此我们可以枚举第一行的所有状态(二进制枚举),然后递推出使第一行全亮的第二行的操作,然后以此类推到第4行为止,然后对第五行判断是否为全1,如果是说明第一行这种状态合法,可以用操作数更新下ans。最后记得判断an原创 2021-09-18 15:31:37 · 155 阅读 · 0 评论 -
基本算法-递推与递归-约数之和
基本算法-递推与递归-约数之和题目描述思路分析代码实现题目描述点这里思路分析分解质因数+快速幂+推公式sum(p, k)表示 p0+p1+…+pk−1p^0+p^1+…+p^{k-1}p0+p1+…+pk−1然后对kkk的奇偶分情况讨论。当kkk为偶数时,原式可化为sum(p,k/2)+pk/2∗sum(p,k/2)sum(p,k/2)+p^{k/2}∗sum(p,k/2)sum(p,k/2)+pk/2∗sum(p,k/2),也即(pk/2+1)∗sum(p,k/2)(p^{k/2}+1)∗原创 2021-09-20 10:10:22 · 180 阅读 · 0 评论 -
基本算法-位运算-起床困难综合症
基本算法-位运算-起床困难综合症题目描述思路分析代码实现题目描述点这里.思路分析位运算符运算的最小单位是每个比特位。位和位之间是独立的。这启发我们单独考虑每一位。题中一共n的操作。calc计算布尔变量x经过n次操作后,第k位上的值。做法是先把操作ops和操作数opnum存下来,之后从高到低遍历每一位,如果这一位填1的话整个数会大于m则只能填0,否则可以填1或0,分情况讨论,填1如果最后结果大于填0的最后结果就填1,否则填0。代码实现#include<bits/stdc++.h>u原创 2021-09-16 14:06:56 · 180 阅读 · 0 评论 -
基本算法-递推与递归-分形之城
基本算法-递推与递归-分形之城题目描述思路分析代码实现题目描述点这里思路分析递归把每个n阶矩阵分为四个部分,发现每个部分都是由n-1阶矩阵经过旋转&平移得到的,因此坐标之间存在着某种映射。想求n阶矩阵中第k个数的位置,首先找到该数在四分之一矩阵中的新编号。然后递归求这个新编号在n-1阶矩阵中的坐标,在经过坐标映射求出在第n阶矩阵中的该点坐标。代码实现#include<bits/stdc++.h>using namespace std;using ll=long lon原创 2021-09-20 10:17:07 · 112 阅读 · 0 评论 -
基础算法-前缀和与差分-最高的牛
基础算法-前缀和与差分-最高的牛题目描述思路分析代码实现题目描述点这里思路分析差分。所有[a,b][a,b][a,b]区间必然不交叉,否则有矛盾。初始高度全设为hhh,读入每个区间[a,b][a,b][a,b],让区间每个数都−1-1−1(因为要让每头牛最高),最后差分序列求原序列。代码实现#include<bits/stdc++.h>using namespace std;const int N=1e4+10;int heights[N];int n,p,h,m;set原创 2021-09-25 18:35:16 · 96 阅读 · 0 评论 -
《算法竞赛进阶指南》 题解(更新中
《算法竞赛进阶指南》 全套题解&索引目录1.基本算法位运算递推与递归前缀和&差分二分排序倍增贪心总结与练习2.基本数据结构栈队列链表与邻接表Hash字符串Trie二叉堆总结与练习3.搜索树与图的遍历深度优先搜索剪枝迭代加深广度优先搜索广搜变形A*IDA*总结与练习4.数学知识质数约数同余矩阵方程高斯消元与线性空间组合计数容斥原理与Mobius函数概率与数学期望博弈论SG函数总结与练习5.数据结构进阶并查集树状数组线段树分块点分治二叉查找树与平衡树初步离线分治算法可持久化数据结构总结与练习6.原创 2021-09-23 19:11:01 · 1189 阅读 · 1 评论 -
基本算法-递推与递归-奇怪的汉诺塔
基本算法-递推与递归-奇怪的汉诺塔题目描述思路分析代码实现题目描述点这里思路分析经典递推/DP问题3个柱子的汉诺塔问题用d数组来表示。d[i]=2*d[i-1]+1;4个柱子的汉诺塔问题可以推广。先把前j个圆盘放在BorC上(可以使用三个盘子因此用f数组来表示),再把后i-j个盘子放在D中(只能用两个盘子,故为d[i-j]),最后再把前j个盘子放回D(可以用四个盘子因此为f[j])代码实现#include<bits/stdc++.h>using namespace std;c原创 2021-09-19 10:34:28 · 124 阅读 · 0 评论 -
基础算法-前缀和与差分-激光炸弹
基础算法-前缀和与差分-激光炸弹题目描述思路分析代码实现题目描述点这里思路分析二位前缀和裸题。预处理出边界,读入,前缀和数组。枚举右下角坐标,算区域内总价值,更新答案即可。代码实现#include<bits/stdc++.h>using namespace std;using ll=long long;const int N = 5050;int n,r,ans;int s[N][N];int main(){ cin>>n>>r;原创 2021-09-22 10:36:44 · 114 阅读 · 0 评论 -
基础算法-前缀和与差分-IncDec序列/增减序列
基础算法-前缀和与差分-IncDec序列/增减序列题目描述思路分析代码实现题目描述点这里思路分析差分先求出差分数组。则a[l−r]+1<=>b[l]+=1,b[r+1]−=1。因此把操作分为三大类。先求出差分数组。则a[l-r]+1<=>b[l]+=1,b[r+1]-=1。因此把操作分为三大类。先求出差分数组。则a[l−r]+1<=>b[l]+=1,b[r+1]−=1。因此把操作分为三大类。第一种:2<=l<=r<=n−1的修改,第二种:1−原创 2021-09-24 16:39:14 · 130 阅读 · 0 评论 -
JZ66 机器人的运动范围
JZ66 机器人的运动范围题目描述思路分析代码实现题目描述点这里思路分析dfs暴搜即可。代码实现class Solution {public: int res=0; int st[110][110]; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; int movingCount(int k, int n, int m) { st[0][0]=1; dfs(0,0,n,m,k); re原创 2021-10-04 15:25:58 · 93 阅读 · 1 评论 -
JZ8 跳台阶
JZ8 跳台阶题目描述思路分析代码实现题目描述点这里思路分析记f[n]f[n]f[n]为跳到n级台阶的方法数。可以发现:f[1]=1,f[2]=2,f[i]=f[i−1]+f[i−2](n>=3)f[1]=1,f[2]=2,f[i]=f[i-1]+f[i-2] (n>=3)f[1]=1,f[2]=2,f[i]=f[i−1]+f[i−2](n>=3)空间复杂度O(N)O(N)O(N) 用a,ba,ba,b两个变量也可以把时间复杂度变成O(1)O(1)O(1)方法和斐波那契数列完原创 2021-09-22 09:27:53 · 74 阅读 · 0 评论 -
JZ16 合并两个排序的链表
JZ16 合并两个排序的链表题目描述思路分析代码实现题目描述点这里思路分析链表模拟题虚拟头节点,链表指针修改,移动。类似于归并排序的归并步骤。代码实现/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* Merge(ListNode* l1, ListNode*原创 2021-10-02 11:22:12 · 76 阅读 · 1 评论 -
JZ43 左旋转字符串
JZ43 左旋转字符串题目描述思路分析代码实现题目描述点这里思路分析字符串题。n对长度取mod,防止循环。ps:字符串操作经常用的两个函数:substr和reversesubstr和reversesubstr和reverse代码实现class Solution {public: string LeftRotateString(string str, int n) { if(str.empty()) return ""; n%=str.size();原创 2021-09-26 14:30:48 · 74 阅读 · 0 评论 -
JZ47 求1+2+3+...+n
JZ47 求1+2+3+...+n题目描述思路分析代码实现题目描述点这里思路分析位运算。用位运算+库函数实现。代码实现class Solution {public: int Sum_Solution(int n) { return (int)(pow(n,2)+n)>>1; }};...原创 2021-09-26 16:29:01 · 48 阅读 · 0 评论 -
JZ10 矩形覆盖
JZ10 矩形覆盖题目描述思路分析代码实现题目描述点这里思路分析状态机dpf[i][0]:摆完前i列,且第i列俩个“横”的方案数;f[i][0]:摆完前i列,且第i列俩个“横”的方案数;f[i][0]:摆完前i列,且第i列俩个“横”的方案数;f[i][1]:摆完前i列,且第i列摆一个“竖“的方案数;f[i][1]:摆完前i列,且第i列摆一个“竖“的方案数;f[i][1]:摆完前i列,且第i列摆一个“竖“的方案数;转移方程为:f[i][1]=f[i−1][1]+f[i−1][0],f[i][0]原创 2021-09-22 12:21:05 · 47 阅读 · 0 评论 -
JZ12 数值的整数次方
JZ12 数值的整数次方题目描述思路分析代码实现题目描述点这里思路分析快速幂板题。注意b可正可负可0。代码实现class Solution {public: double Power(double a, int b) { if(!b) return 1; if(b<0) return 1.0/qmi(a,-b); return qmi(a,b); } double qmi(double a,int b){原创 2021-09-22 12:26:16 · 59 阅读 · 0 评论 -
JZ61 序列化二叉树
JZ61 序列化二叉树题目描述思路分析代码实现题目描述点这里思路分析二叉树二叉树序列化和反序列化。选择适当的序列化方法即可。这里用前序遍历。代码实现class Solution {public: char* Serialize(TreeNode *root) { if(!root) return "#"; string res=to_string(root->val); res.push_back(',');原创 2021-10-05 15:58:25 · 96 阅读 · 1 评论 -
JZ23 二叉搜索树的后序遍历序列
JZ23 二叉搜索树的后序遍历序列题目描述思路分析代码实现题目描述点这里思路分析二叉搜索树+递归二叉搜索树的后序遍历序列有如下特点:1.序列最后一个元素为根节点。2.序列可以根据最后一个元素的大小划分为两个子序列/这样就满足了递归的条件。代码实现class Solution {public: vector<int> seq; bool VerifySquenceOfBST(vector<int> sequence) { if(se原创 2021-10-04 09:48:07 · 57 阅读 · 1 评论 -
JZ57 二叉树的下一个结点
JZ57 二叉树的下一个结点题目描述思路分析代码实现题目描述点这里思路分析二叉树节点的后继。经典问题。分类讨论解决。代码实现/*struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL原创 2021-10-04 13:24:32 · 53 阅读 · 1 评论 -
JZ1 二维数组中的查找
JZ1 二维数组中的查找题目描述思路分析代码实现题目描述点这里.思路分析模拟题。方法一:暴力做法遍历一边即可,O(NM)方法二:从左下角(x,y)处的值和target对比,移动x,y。本质上是双指针,一次排除一行的情形。(双指针本质上就是对暴力枚举的优化)另外注意判空。代码实现class Solution {public: bool Find(int target, vector<vector<int> > array) { int n=a原创 2021-09-15 14:24:30 · 58 阅读 · 0 评论 -
JZ49 把字符串转换成整数
JZ49 把字符串转换成整数题目描述思路分析代码实现题目描述点这里思路分析字符串模拟题。简单模拟下就好,直接看代码。代码实现class Solution {public: int StrToInt(string str) { int res=0; int k=0; bool pos=true; if(str[k]=='-') pos=false,k++; else if(str[k]=='+') pos=t原创 2021-09-27 13:48:24 · 63 阅读 · 0 评论 -
JZ17 树的子结构
JZ17 树的子结构题目描述思路分析代码实现题目描述点这里思路分析二叉树+递归代码实现/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: bool HasSubtree(TreeNode* root1, T原创 2021-10-03 15:05:00 · 56 阅读 · 1 评论 -
JZ60 把二叉树打印成多行
JZ60 把二叉树打印成多行题目描述思路分析代码实现题目描述点这里思路分析二叉树+bfs这个分行打印和不分行打印的区别是:ans和path数组以及队列中nullptr的哨兵作用ans和path数组以及队列中nullptr的哨兵作用ans和path数组以及队列中nullptr的哨兵作用代码实现/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(原创 2021-10-03 16:12:52 · 59 阅读 · 1 评论 -
JZ2 替换空格
JZ2 替换空格题目描述思路分析代码实现题目描述点这里.思路分析模拟题,遍历下就OK。代码实现class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return string字符串 */ string replaceSpace(string s) { string原创 2021-09-16 12:44:39 · 72 阅读 · 0 评论 -
《剑指offer》题解(已完结)
剑指offer题解-------每日更新-------(当前更新至 JZ7 )JZ1 二维数组中的查找JZ2 替换空格JZ3 从尾到头打印链表JZ4 重建二叉树JZ5 用两个栈实现队列JZ6 旋转数组的最小数字JZ7 斐波那契数列原创 2021-09-22 09:17:37 · 342 阅读 · 1 评论 -
JZ44 翻转单词序列
JZ44 翻转单词序列题目描述思路分析代码实现题目描述点这里思路分析字符串+双指针。reversereversereverse函数的使用。几个重载函数,建议取看看文档。代码实现class Solution {public: string ReverseSentence(string str) { reverse(str.begin(),str.end()); for(int i=0;i<str.size();i++){ i原创 2021-09-26 14:32:40 · 70 阅读 · 0 评论 -
JZ55 链表中环的入口结点
JZ55 链表中环的入口结点题目描述思路分析代码实现题目描述点这里思路分析链表+哈希表一个哈希表对地址判重即可。代码实现/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: unordered_map<ListNode*,bool>原创 2021-10-02 11:25:59 · 70 阅读 · 1 评论 -
JZ20 包含min函数的栈
JZ20 包含min函数的栈题目描述思路分析代码实现题目描述点这里思路分析数据结构模拟题比传统的栈多了个O(1)O(1)O(1)的minminmin查询功能。用两个栈,一个栈为主栈,用于存储元素。另一个栈为辅栈,用于存储最小值。(栈顶即为最小值)。话说栈模拟的很多题都能用两个栈实现。代码实现class Solution {public: stack<int> stk1,stk2; void push(int val) { stk1.push(val原创 2021-09-23 14:42:12 · 45 阅读 · 0 评论 -
JZ62 二叉搜索树的第k个结点
JZ62 二叉搜索树的第k个结点题目描述思路分析代码实现题目描述点这里思路分析二叉树+dfs代码实现/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: Tr原创 2021-10-03 14:46:12 · 65 阅读 · 1 评论 -
JZ50 数组中重复的数字
JZ50 数组中重复的数字题目描述思路分析代码实现题目描述点这里思路分析哈希表没什么可说的…代码实现class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param numbers int整型vector * @return int整型 */ int duplicate(vector<int>& nu原创 2021-09-27 13:51:29 · 62 阅读 · 0 评论 -
JZ35 数组中的逆序对
JZ35 数组中的逆序对题目描述思路分析代码实现题目描述点这里思路分析经典问题:求逆序对两种做法:树状数组和归并排序。简单起见用归并排序来写:维护一个答案ansansans,归并排序的归并过程中,如果发现前边元素>>>后边元素,则ans+=mid−x+1ans+=mid-x+1ans+=mid−x+1;代码实现class Solution {public: int ans; int InversePairs(vector<int> data)原创 2021-09-25 15:55:50 · 67 阅读 · 0 评论 -
JZ27 字符串的排列
JZ27 字符串的排列题目描述思路分析代码实现题目描述点这里思路分析暴搜 / 全排列next_permutation()枚举代码实现class Solution {public: vector<string> ans; bool st[20]; unordered_map<string,int> hash; vector<string> Permutation(string str) { dfs(0,str,""原创 2021-09-24 12:15:13 · 77 阅读 · 0 评论 -
JZ5 用两个栈实现队列
JZ5 用两个栈实现队列题目描述思路分析代码实现题目描述点这里思路分析栈模拟队列。stack1当作住栈,stack2当作副栈。数组都压在主栈内。push的时候直接加入栈1即可。pop的时候把栈1元素从上到下加入栈2,弹出并返回栈2顶,然后再把栈2元素加入回到栈1即可。代码实现class Solution{public: void push(int node) { stack1.push(node); } int pop() {原创 2021-09-18 19:01:19 · 54 阅读 · 0 评论 -
JZ37 数字在升序数组中出现的次数
JZ37 数字在升序数组中出现的次数题目描述思路分析代码实现题目描述点这里思路分析二分。找到≥k≥k≥k的最小的数和≤k≤k≤k的最大的数。注意判断是否=k=k=k。不等于kkk直接返回000。代码实现在这里插入代码片...原创 2021-09-25 15:49:38 · 68 阅读 · 0 评论 -
JZ46 hai子们的游戏(圆圈中最后剩下的数)
@[TOC](JZ46 孩子们的游戏(圆圈中最后剩下的数))题目描述点这里思路分析约瑟夫问题。数组链表模拟/递推递归,都能做。暴力模拟的方法就不讲了,当成链表节点就好。主要写下递归递推做法。递推/递归的关键是找到递推关系。设f(n,m)f(n,m)f(n,m)为问题规模为n,mn,mn,m时问题的答案。则画图重新标号+映射分析可得递推式f(n,m)=(f(n−1,m)+m) mod nf(n,m)=(f(n-1,m)+m)\ mod\ nf(n,m)=(f(n−1,m)+原创 2021-10-05 14:45:08 · 274 阅读 · 1 评论 -
JZ31 整数中1出现的次数(从1到n整数中1出现的次数)
JZ31 整数中1出现的次数(从1到n整数中1出现的次数)题目描述思路分析代码实现题目描述点这里思路分析数位统计dp的简单版这道题分别枚举每一位上1出现的次数即可。更一般的题目是问:[a,b][a,b][a,b]中0−90-90−9各出现多少次,这个可以参考我的其他题解。时间复杂度O(log2n)O(log^2n)O(log2n),预处理left,rightleft,rightleft,right和ttt可以做到O(logn)O(logn)O(logn)代码实现class Solution原创 2021-10-01 23:03:36 · 58 阅读 · 1 评论 -
JZ7 斐波那契数列
JZ7 斐波那契数列题目描述思路分析代码实现题目描述点这里思路分析f[0]=0;f[0]=0;f[0]=0;f[1]=f[2]=1;f[1]=f[2]=1;f[1]=f[2]=1;f[i]=f[i−1]+f[i−2];f[i]=f[i-1]+f[i-2];f[i]=f[i−1]+f[i−2];方法1:递归 会爆栈方法2:递推 可以过方法3:矩阵乘法优化,复杂度O(logN)O(logN)O(logN) 比较长,具体实现可以参考这篇别人的博客代码实现//递推 时间复杂度O(n)clas原创 2021-09-20 09:53:10 · 64 阅读 · 0 评论 -
JZ41 和为S的连续正数序列
JZ41 和为S的连续正数序列题目描述思路分析代码实现题目描述点这里思路分析枚举/暴搜枚举起点,枚举长度,求和,更新答案。纯暴力。代码实现class Solution {public: vector<vector<int> > FindContinuousSequence(int sum) { vector<vector<int>> ans; vector<int> path;原创 2021-09-26 14:25:42 · 72 阅读 · 0 评论