
Algorithm
文章平均质量分 50
小桥落花流水
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
背包问题
待定0-1背包问题1049. 最后一块石头的重量 II原创 2021-01-26 23:50:07 · 110 阅读 · 0 评论 -
图
待定1.判断图是否有环并查集的问题 拓扑排序原创 2021-01-13 22:24:43 · 100 阅读 · 0 评论 -
拓扑排序
一.基本定义1.定义:拓扑排序:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。2.简单例子:上述拓扑排序的顺序(不唯一):1,2,3,4.原创 2021-01-13 22:20:18 · 2629 阅读 · 0 评论 -
字符串Hash
一.Rabin-Karp 字符串编码 转载自--最长快乐前缀背景知识Rabin-Karp 字符串编码是一种将字符串映射成整数的编码方式,可以看成是一种哈希算法。具体地,假设字符串包含的字符种类不超过∣Σ∣(其中 Σ 表示字符集),那么我们选一个大于等于∣Σ∣ 的整数base,就可以将字符串看成base 进制的整数,将其转换成十进制数后,就得到对应字符的编码。例如给定字符串 s = abcas,其包含的字符种类为 3(即 abc 三种)。我们取base=9...原创 2021-01-10 22:36:23 · 231 阅读 · 0 评论 -
最长上升序列问题简单总结
一.最长上升序列基本思路:先排序,然后用动态规划思路解决问题,转移方程:dp[i]=max(dp[i],dp[j]+1) ,if condition二.例题例题1--300. 最长上升子序列,给定一个无序的整数数组,找到其中最长上升子序列的长度。基本思路:对于子序列最值问题,子序列尾部元素是否被选中是一个很重要的隐含状态,它可以帮忙递推下一个的状态,动态规划,dp[i]表示以i为终点的最长上升长度。对于一个严格递增的子序列,当前元素是否能续上,主要是比较当前元素和改子序列的尾部元.原创 2021-01-09 22:16:47 · 698 阅读 · 0 评论 -
有限状态自动机
待定二.应用例题1--剑指 Offer 56 - II. 数组中数字出现的次数 II,在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。 参考 Krahets 基本思路:上述思想的改进,模3的结果,只能是0,1,2,使用状态机的思想,00->01->10->00……,其中00代表0个1,01代表1个1,10代表2个1,其中,two代表状态第一位,one代表状态第二位two的状态转移是建在one已经更新的前提下,且one的状..原创 2021-01-05 15:23:37 · 190 阅读 · 0 评论 -
topK问题
1.topk问题解决方法:一般可以采用快排,堆排序2.经典例题:例题1--剑指 Offer 40. 最小的k个数,输入整数数组arr,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。最大堆 vector<int> getLeastNumbers(vector<int>& arr, int k) { priority_queue<int> q; ...原创 2020-12-30 20:18:15 · 116 阅读 · 0 评论 -
快速幂的应用
一.快速幂令f=pow(x,n)=x*x...*x,一共n个x相乘 f=pow(x*x,n/2) if n是偶数 f=pow(x*x,n/2)*x if n是奇数 二.应用剑指 Offer 16. 数值的整数次方实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。 double myPow(double x, int n) { doubl..原创 2020-12-24 01:48:08 · 218 阅读 · 0 评论 -
动态规划之股票问题系列
121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II123. 买卖股票的最佳时机 III188. 买卖股票的最佳时机 IV309. 最佳买卖股票时机含冷冻期714. 买卖股票的最佳时机含手续费参考:股票问题系列通解(转载翻译)...原创 2020-12-22 15:30:22 · 299 阅读 · 0 评论 -
分治
待定一.分治思想1.基本定义分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。2.基本步骤(1)分解,将要解决的问题划分成若干规模较小的同类问题;(2)求解,当子问题划分得足够小时,用较简单的方法解决;(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解二.分治思想之应用核心思想:分而治之,如二分法,归并排序……例题1--321. 拼接最大数,给定长度..原创 2020-12-15 22:44:07 · 180 阅读 · 0 评论 -
线段树
待定:二.线段树之应用线段树应用场景:区域和检索例题1--307. 区域和检索 - 数组可修改,给定一个整数数组 nums,求出数组从索引i到j(i≤j) 范围内元素的总和,包含i,j两点。update(i, val) 函数可以通过将下标为i的数值更新为val,从而对数列进行修改。基本思路:区域和很典型线段树的应用,利用线段树可以在在o(lg(n))的时间复杂度内完成线段树的构建,大小是2*n,下标从1开始,是一颗完全二叉树,当前节点cur的左节点为l...原创 2020-12-15 22:35:27 · 211 阅读 · 0 评论 -
桶思想之运用
待定1.任务调配 621. 任务调度器用桶来演示,一共s轮,代表有s个桶,其中,每个桶都大于等于n+1(包括冷却) 装桶规则,在每个桶都大于n+1之前,尽量将每个桶都装满(也就是说每一轮中,不必将所有不同任务都过一遍),每个桶装大于n+1后,总耗时就是任务总数 int leastInterval(vector<char>& tasks, int n) { vector<int> dict(26,0); int res=...原创 2020-12-07 23:01:39 · 353 阅读 · 0 评论 -
字符串总结
待定1.字符串常用函数2.字符串之查找(模糊查找,kmp)3.原创 2020-12-07 20:06:33 · 874 阅读 · 0 评论 -
归并排序之应用
1. 利用归并排序查找左右边界327. 区间和的个数 vector<long> tmp; int merge(vector<long> &sum,int l,int r,int &lower,int &upper){ if(r<=l) return 0; //若前缀和数组从一开始,仅需要改变该处,针对单个元素,return sum[l]>=lower&&sum[l...原创 2020-12-07 19:56:39 · 378 阅读 · 0 评论 -
二分法查找之应用
待定1。二分法查找元素2.二分法查找边界34. 在排序数组中查找元素的第一个和最后一个位置使用nums[mid]>=target,得到最左边的 使用nums[mid]>target,得到最右边的 int binarySearch(vector<int> &nums,int target,bool lower){ int left=0,right=nums.size()-1; int ans=nums.size(); ..原创 2020-12-07 19:53:17 · 374 阅读 · 0 评论 -
位运算+逻辑运算符
待定参考位操作奇技淫巧之原理加实践原创 2020-12-05 19:34:39 · 549 阅读 · 0 评论 -
多指针的应用
1.多指针解决环的问题利用快慢指针来检查是否存在环202. 快乐数基本格式fast=getNext(n);slow=n;while(fast!=slow){ slow=getNext(slow); fast=getNext(getNext(fast);}原创 2020-12-05 16:52:43 · 137 阅读 · 0 评论 -
动态规划
待完成1.动态规划之例题 例题1--放苹果309. 最佳买卖股票时机含冷冻期312. 戳气球300. 最长上升子序列原创 2020-12-04 21:38:37 · 203 阅读 · 0 评论 -
哨兵之应用
待完成1.哨兵例子121. 买卖股票的最佳时机原创 2020-12-04 21:36:05 · 145 阅读 · 0 评论 -
贪心总结
待解决1.贪心问题121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II406. 根据身高重建队列 300. 最长上升子序列1024. 视频拼接 763. 划分字母区间原创 2020-12-04 21:33:16 · 230 阅读 · 0 评论 -
单调栈总结
1.单调栈问题举例121. 买卖股票的最佳时机原创 2020-12-04 21:29:34 · 153 阅读 · 0 评论 -
并查集
一.并查集的基本特性并查集从集合上讲,主要是解决一些元素分组的问题,管理一系列不相交的集合 主要有两个操作: Union:将两个不相交的集合合并为一个集合 Find:查询两个元素是否再同一个集合中并查集从图角度讲,主要是解决动态连通性问题,可以以家族(朋友圈)为例子,你爸爸的亲戚也是你的亲戚。 连通的特性1.自反性:p和p连通2.对称性:若p和q连通,则q和p连通3.传递性:若p和q连通,q和r连通,则p和r连通 二.并查集的基本思路:1....原创 2020-11-29 23:08:19 · 518 阅读 · 0 评论 -
回溯算法总结
1.回溯的本质是n叉树的深度遍历,所以要注意剪枝。2.回溯算法三部曲确定参数和返回值 确定终止条件 单层循环3.回溯算法的模板void backtrack(param……){ if(终止条件){ 存放结果; return; } for(遍历:本层n叉树的元素){ 处理节点; backtrack(参数,选择列表); 撤销操作;原创 2020-11-01 23:55:49 · 445 阅读 · 0 评论 -
堆粗浅的总结
堆的特性:是一个完全二叉树,假设下标从零开始,对于索引cur而言:左孩子:2*cur+1; 右孩子:2*cur+2; 父节点:(cur-1)/2最大堆排序:参考1参考2void maxHeapDown(vector<int> &nums, int start, int end) { int left = start * 2 + 1; int right = start * 2 + 2; int largeIndex; while (left <= end).原创 2020-10-27 21:09:57 · 112 阅读 · 0 评论 -
快排
快排的基本思想快排用到的是分而治之的思想,随机的选取数组中的一个元素pivot,将小于pivot的排在左边,大于等于pivot的排在右边, 然后在对左右两边的序列采用相同的方法,直至每个子数组只剩一个元素为止。 //单指针 int randomPartion(vector<int> &nums,int left,int right){ int rand_index=rand()%(right-left+1)+left; //最好随机原创 2020-10-27 10:15:51 · 378 阅读 · 0 评论 -
关于算法上的总结
1.单调栈的问题2.并查集的问题3.动态问题4.分治5.贪心6.滑动窗口7.堆8.回溯9 多指针10.字符串问题11.位运算12.附哨兵原创 2020-09-18 02:19:33 · 153 阅读 · 0 评论 -
二叉树的遍历(前序,中序,后序,层次)
1.二叉树的前序遍历;中,左,右//dfs 之后中序和后序遍历类似,就不写了。 void dfs(TreeNode * root,vector<int> &ans){ if(root){ ans.push_back(root->val); dfs(root->left,ans); dfs(root->right,ans); } }//迭代原创 2020-09-14 21:48:21 · 243 阅读 · 0 评论