
算法
张国星就是个弱智
我是张国星,我就是个弱智
展开
-
二叉树前/中/后序遍历(栈,Morris实现)
使用栈模拟前序遍历:进栈顺序先右节点再左节点vector<int> preorderTraversal(TreeNode* root) { if(root==NULL)return {}; vector<int>ans; stack<TreeNode*>st; st.push(root); while(!st.empty()){ TreeNode* head=st原创 2020-10-26 20:55:14 · 321 阅读 · 0 评论 -
Prim算法
算法描述Prim算法和kruskal算法一样都用于找最短生成树,其是从顶点的角度来进行选择。算法过程维护一个集合S将某一点x加入该集合S中重复下列操作直到S中存在所有的顶点集合选取与集合S相连的最短边所在的顶点加入集合S中算法证明参见kurskal...原创 2020-09-30 10:22:53 · 196 阅读 · 0 评论 -
kruskal
kruskal是用来找连通图中的最小生成树,简单点来说,就是对于n个点,找n-1条边,将n个点连接起来,使得边的权值相加最小,这样构成的树就叫最小生成树算法过程描述将所有边按照权值进行排序遍历所有边,按照权值从小到大选取。选取的一个边看其顶点是否处于一个连通集中,如果属于,则放弃该边,如果不属于,选取该边进入生成树中,并将两顶点所处集合合并产生的生成树为最小生成树算法证明对于一个点x,所有与这个点直接相连的边中最小的边必定是最小生成树的一条边:假设该边为x->y,如果不选该边,那么必原创 2020-09-29 14:59:13 · 117 阅读 · 0 评论 -
Floyd算法
Floyd算法是一种利用动态规划思想寻找多源点之间最短路径的算法。该算法时间复杂度为O(n^3),对于稠密图来说效果比执行[V]次的Dijkstra算法以及SPFA算法要好,其可用于边权为负的图。代码编写简单DP思路f[k][i][j]表示i和j之间可以通过编号为1…k的节点的最短路径。有2种转义方式:1.f[k][i][j]由f[k-1][i][j]转移而来,表示i到j不经过点k2.f[k][i][j]由f[k-1][i][k]+f[k-1][k][j]转移而来,表示经过k这个点那么状态转移方原创 2020-09-28 14:40:44 · 999 阅读 · 0 评论 -
Bellman-Ford, SPFA算法
单源最短路径算法,与dijkstra相比,其边的权值可以为负值,无法用于有负权回路的图。基本思路是对图进行多次松弛操作。算法过程1.定义dis[u] 为点u到源点的最短距离2.对每一条边进行松弛操作,循环n-1次算法解释这个算法比dijkstra要好理解很多,实际上就是bfs,循环执行n-1次,每次通过每条边进行松弛操作,循环第一次执行时,松弛了通过一条边与源点相连的顶点,第二次执行时,松弛了通过2条边与源点相连的顶点,这样最多经过n-1次松弛,便能找到所有结点到源点的最短路径算法模板int原创 2020-09-25 15:36:20 · 121 阅读 · 0 评论 -
dijsktra算法
单源最短路径算法,用于找出一个点与其他点的最短路径,只能用于不带负权边的图,适合于稠密图(边多的图)算法思路本质上是贪心算法,其思路是维护一个初始集合S,里面的元素代表已经确定了最短路的点,设所有点集合为V,每次循环从V-S集合中挑选此刻到源点最近距离的点,将此点加入S中,并更新所有此刻未被加入到S集合中的点到源点的距离(松弛),当V=S时,循环终止算法证明设初始集合S,dist[u]:当前u点经过S中的点到源点的距离,short[u]:u点到源点的最短距离(可以不经过S中的点)使用数学归纳法进行原创 2020-09-24 17:07:41 · 287 阅读 · 0 评论 -
二分查找边界问题
二分查找思路简单,复杂点在边界的处理上思路1:在循环体中查找元素void search(int *nums, int left, int right, int target){ // 在[left,right]区间里进行查找 while(left<=right){ int mid=left+(right-left)/2; if(nums[mid]==target){ return mid; }原创 2020-07-02 16:39:36 · 388 阅读 · 0 评论 -
KMP算法
1.KMP算法简单介绍KMP算法是用来查找某一字符串p在主串s中完整出现的起始位置如果用暴力的方法来做的话就是从字符串s以及p的头部开始查找,当某一位不符合时,从字符串s的下一位以及p的头部重新开始查找。KMP的思想是不动i,改变j使得p尽量能够移动到有效位置当字符不匹配时,直接改变j的位置,而不是从j的头部重新开始找。那么重要的就是要求字符串p中每一个字符如果不匹配了,它需要跳到的下...原创 2020-01-19 10:28:26 · 186 阅读 · 0 评论 -
leetcode 23 合并K个排序链表
方法有很多种,下面代码是使用的分治思想,两两链表进行合并/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solut...原创 2020-01-16 15:56:54 · 94 阅读 · 0 评论 -
leetcde - 去除重复数字
class Solution {public: int removeDuplicates(vector<int>& nums) { int count=0; for(int i=1;i<nums.size();i++) { if(nums[i]==nums[i-1])count++; ...原创 2019-05-06 17:40:02 · 571 阅读 · 0 评论 -
leetcode水题 计算容器最大装水量
思路很简单,就是首先找到最右边和最左边构成一个容器,计算它的容积,然后如果最左边的边比最右边的边短,高度取决于最左边的边,那么最右边的边改变的话只会将宽越变越小,所以只有可能变左边的边,使得高度变高,宽度变窄。反之一样。class Solution {public: int maxArea(vector<int>& height) { int l=...原创 2019-04-19 17:53:21 · 1748 阅读 · 0 评论 -
leetcode 10 模式匹配
可以用动态规划来做,当s[i]==p[j]||p[j]=='.'时,此时dp[i][j] =dp[i-1][j-1];当p[j]=='*'时,如果s[i] !=p[j-1]&&p[j-1]!='.',dp[i][j]=dp[i][j-2];否则dp[i][j]=dp[i][j-2]||dp[i-1][j](要么进行匹配,要么不匹配)class Solution {pub...原创 2019-04-19 16:58:45 · 583 阅读 · 0 评论 -
最长回文子串
之前一直用的if(s[i]==s[j])dp[i][j]=dp[i+1][j-1]这种思想来做的,复杂度有n2然后看到了manacher算法,复杂度可以达到n原创 2019-04-03 17:50:54 · 144 阅读 · 0 评论 -
算法题:两个有序数组求中位数
leetcode上遇到的一道题,感觉很有意思因为要求O(log(m+n)),所以第一反应时用二分来找,但是该怎么用二分呢?数组A,B分别有序,我们可以先找到数组A中的一条分界线i,使得数组A分为A_left,和A_right两部分,那么因为时要找到中位数,我们可以直接计算出B数组的一条分界线j,使得size(Aleft)+size(Bleft)=size(Aright)+size(Brigh...原创 2019-03-21 15:49:57 · 9385 阅读 · 1 评论